次は正しいですか?
- 各エントリを複数の方法(io操作またはアノテーション)で処理する必要がある場合、ディスラプターパターンは、競合することなく複数のコンシューマーを使用して並列化できるため、並列パフォーマンスとスケーラビリティが向上します。
- 逆に、ワークスティーリング(つまり、エントリをローカルに保存し、他のスレッドからエントリを盗む)は、各エントリを単一の方法でのみ処理する必要がある場合、ディスラプターパターンでエントリを複数のスレッドにばらばらに分散すると競合が発生するため、並列パフォーマンスとスケーラビリティが向上します。
(そして、複数のプロデューサー(つまりCAS操作)が関与している場合、ディスラプターパターンは他のロックレスマルチプロデューサーマルチコンシューマーキュー(ブーストなど)よりもはるかに高速ですか?)
私の状況の詳細:
エントリを処理すると、いくつかの新しいエントリが生成される可能性があり、それらも最終的に処理する必要があります。パフォーマンスが最優先され、FIFO順に処理されるエントリが2番目に優先されます。
現在の実装では、各スレッドはローカルFIFOを使用し、そこで新しいエントリを追加します。アイドルスレッドは、他のスレッドのローカルFIFOから作業を盗みます。スレッドの処理間の依存関係は、ロックレスで機械的に同情的なハッシュテーブル(書き込み時のCAS、バケットの粒度)を使用して解決されます。これにより、競合はかなり少なくなりますが、FIFOの順序が崩れることがあります。
ディスラプタパターンを使用すると、FIFOの順序が保証されます。しかし、エントリをスレッドに分散すると、作業を盗むローカルFIFO(各スレッドのスループットはほぼ同じ)よりもはるかに高い競合(読み取りカーソルでのCASなど)が発生しませんか?
私が見つけた参考文献
ディスラプターに関する標準テクニカルペーパー(第5章+第6章)のパフォーマンステストは、ばらばらの作業分散をカバーしていません。
https://groups.google.com/forum/?fromgroups=#!topic/lmax-disruptor/tt3wQthBYd0は、ディスラプターとワークスティーリングについて私が見つけた唯一のリファレンスです。共有状態がある場合、スレッドごとのキューは劇的に遅くなると述べていますが、詳細や理由については説明していません。この文が私の状況に当てはまるとは思えません。
- ロックレスハッシュテーブルで解決されている共有状態。
- 消費者間でエントリをばらばらに配布する必要があります。
- 作業の盗用を除いて、各スレッドはローカルキューでのみ読み取りと書き込みを行います。