私は Disruptor フレームワークを使用して、一部のデータに対して高速なリードソロモン エラー修正を実行しています。これは私のセットアップです:
RS Decoder 1
/ \
Producer- ... - Consumer
\ /
RS Decoder 8
- プロデューサは、2064 バイトのブロックをディスクからバイト バッファに読み取ります。
- 8 つの RS デコーダ コンシューマは、リードソロモン エラー訂正を並行して実行します。
- コンシューマはファイルをディスクに書き込みます。
ディスラプター DSL 用語では、セットアップは次のようになります。
RsFrameEventHandler[] rsWorkers = new RsFrameEventHandler[numRsWorkers];
for (int i = 0; i < numRsWorkers; i++) {
rsWorkers[i] = new RsFrameEventHandler(numRsWorkers, i);
}
disruptor.handleEventsWith(rsWorkers)
.then(writerHandler);
ディスク出力コンシューマー (no part)がない.then(writerHandler)
場合、コンシューマーを追加するとすぐに測定されたスループットは 80 M/s です。/dev/null
従属消費者の場合、パフォーマンスは 50 ~ 65 M/s に低下します。
Oracle Mission Control でプロファイリングしたところ、CPU 使用率のグラフは次のようになりました。
追加のコンシューマーなし:
追加のコンシューマ:
グラフのこの灰色の部分は何ですか? また、どこから来ているのでしょうか? スレッドの同期に関係していると思いますが、Mission Control には、そのような遅延や競合を示す他の統計は見つかりません。