因项目的原因近一段时间在研究Disruptor,发现几个现象,向LZ求证一下:
我们的测试场景:
1)多线程做为消息事件的生产者,均以单条消息事件的方式发给调度程序;10个线程,每个线程发1000个事件消息;
2)调度程序采用一个一级Buffer用来缓存生产者发送来的消息事件(在放入一级缓存前sleep 2个毫秒,模拟业务处理的耗时);其中这个一级BUFFER分别采用LinkedList、BlockingQueue、Disruptor RingBuffer三种容器进行测试;
3)调度程序每次从一级Buffer获取100条消息事件,放入一个由BlockingQueue构造的二级Buffer,相当于这个Buffer中的每个slot保存的都是一个消息事件集合(Collection);
4)采用ThreadPoolExecutor的方式分配5个子线程,用于处理二级Buffer中的消息事件集合。
在测试Disruptor时,发现:
1)SingleThreadedClaimStrategy策略模式比MultiThreadedLowContentionClaimStrategy策略模式的速度要快。前者用时2.2秒左右,后者用时3.2秒(等待模式均使用YieldingWaitStrategy)。不过,SingleThreadedClaimStrategy模式有丢单的问题,最离谱的情况下,最终只能收到8000个左右的事件;仅修改到MultiThreadedLowContentionClaimStrategy,就可以正常收到全部10000个事件消息。测试过程中RingBuffer Size设置为16384。目前不明。
2)MultiThreadedLowContentionClaimStrategy下测试等待模式对性能影响:
YieldingWaitStrategy:3秒左右
BlockingWaitStrategy:2.2秒左右
SleepingWaitStrategy:2.4秒左右
2)无压力(系统空闲)场景,对比等待模式对CPU的占用情况:(线程策略为MultiThreadedLowContentionClaimStrategy)
YieldingWaitStrategy:CPU资源平均在25%左右;
BlockingWaitStrategy:CPU资源平均在3%左右;
SleepingWaitStrategy:CPU资源平均在8%左右;