我正在使用Disruptor框架对某些数据执行快速Reed-Solomon错误校正。这是我的设置:
RS Decoder 1
/ \
Producer- ... - Consumer
\ /
RS Decoder 8
用破坏者DSL术语来说,设置如下所示:
RsFrameEventHandler[] rsWorkers = new RsFrameEventHandler[numRsWorkers];
for (int i = 0; i < numRsWorkers; i++) {
rsWorkers[i] = new RsFrameEventHandler(numRsWorkers, i);
}
disruptor.handleEventsWith(rsWorkers)
.then(writerHandler);
当我没有磁盘输出使用者(没有
.then(writerHandler)
部分)时,一旦添加使用者,即使它写入/dev/null
,甚至没有写入,所测得的吞吐量为80 M/s。声明为从属消费者,性能下降到50-65 M/s。我已经使用Oracle Mission Control对其进行了概要分析,这是CPU使用情况图显示的内容:
没有其他使用者:
和其他使用者:
图中的灰色部分是什么,它是从哪里来的?我想它与线程同步有关,但是我在Mission Control中找不到任何其他统计信息来表明任何此类延迟或争用。
最佳答案
您的假设是正确的,这是线程同步问题。
从API Documentation for EventHandlerGroup<T>.then
(强调我的)
这必然会降低吞吐量。像漏斗一样思考它:
消费者必须先完成每个EventProcessor
的wait处理,然后才能解决瓶颈问题。