我正在使用 Disruptor 框架对某些数据执行快速的 Reed-Solomon 纠错。这是我的设置:
RS Decoder 1
/ \
Producer- ... - Consumer
\ /
RS Decoder 8
- 生产者将 2064 字节的块从磁盘读取到字节缓冲区中。
- 8 个 RS 解码器消费者并行执行 Reed-Solomon 纠错。
- 消费者将文件写入磁盘。
在破坏者 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)
部分)时,测量的吞吐量为 80 M/s,只要我添加消费者,即使它写入/dev/null
,甚至不写入,但它被声明为依赖消费者,性能下降到 50-65 M/s。
我已经使用 Oracle Mission Control 对其进行了分析,这就是 CPU 使用率图表显示的内容:
没有额外的消费者:
有一个额外的消费者:
图中这个灰色部分是什么?它来自哪里?我想它与线程同步有关,但我在任务控制中找不到任何其他统计数据可以表明任何此类延迟或争用。