我正在使用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)部分)时,一旦添加使用者,即使它写入/dev/null,甚至没有写入,所测得的吞吐量为80 M/s。声明为从属消费者,性能下降到50-65 M/s。

    我已经使用Oracle Mission Control对其进行了概要分析,这是CPU使用情况图显示的内容:

    没有其他使用者:

    和其他使用者:

    图中的灰色部分是什么,它是从哪里来的?我想它与线程同步有关,但是我在Mission Control中找不到任何其他统计信息来表明任何此类延迟或争用。

    最佳答案

    您的假设是正确的,这是线程同步问题。
    API Documentation for EventHandlerGroup<T>.then (强调我的)

    这必然会降低吞吐量。像漏斗一样思考它:

    消费者必须先完成每个EventProcessorwait处理,然后才能解决瓶颈问题。

    08-03 13:58