2

以下は、書籍 Java Concurrency in Practice の第 12.2 章パフォーマンスのテストからの抜粋であり、著者はバウンド バッファー実装のスループットについて語っています。

図 12.1 は、1、10、100、および 1000 のバッファー容量を使用した 4 ウェイ マシンでのサンプル結果を示しています。バッファー サイズが 1 の場合、スループットが非常に低下することがすぐにわかります。これは、各スレッドがブロックして別のスレッドを待機する前に、ほんの少ししか進行できないためです。バッファー サイズを 10 に増やすと劇的に効果がありますが、10 を超えると、収益が減少します。

最初は、スレッドを追加してもパフォーマンスがわずかに低下するだけであることに戸惑うかもしれません。その理由をデータから確認するのは困難ですが、テストの実行中に perfbar などの CPU パフォーマンス メーターで確認するのは簡単です。多くのスレッドがあっても、計算はあまり行われず、そのほとんどがスレッドのブロックとブロック解除に費やされます。 . そのため、パフォーマンスをあまり損なうことなく、より多くのスレッドが同じことを行うための十分な CPU スラックがあります。

ただし、このデータから、バウンド バッファーを使用するプロデューサー/コンシューマー プログラムにいつでもスレッドを追加できると結論付けないように注意してください。このテストは、アプリケーションをシミュレートする方法がかなり人為的です。プロデューサーは、キューに配置されたアイテムを生成するためにほとんど作業を行わず、コンシューマーは、取得されたアイテムに対してほとんど作業を行いません。実際のプロデューサー/コンシューマー アプリケーションのワーカー スレッドがアイテムを生成および消費するために重要な作業を行う場合 (一般的にそうです)、このスラックはなくなり、スレッドが多すぎることによる影響が非常に顕著になる可能性があります。このテストの主な目的は、バウンド バッファーを介したプロデューサーとコンシューマーのハンドオフが全体のスループットに課す制約を測定することです。

ここに画像の説明を入力

ここでのcpu slackとはどういう意味ですか? より多くのスレッドを追加してもスループットが低下しないのはなぜですか? 私は、バッファ サイズの制限が一定に保たれていると仮定して、スレッドを追加するとパフォーマンスがわずかに低下するという著者の説明には従いません。

編集:私は1つの理由を考えることができます:この場合、スレッドによって実際の作業が行われていないため、共有メモリバス上のトラフィックの増加という古典的な問題、スレッドのコンテキスト切り替えによるキャッシュミスの数は大きな役割を果たしていませんますます多くのスレッドが追加されています。スレッドがもう少し作業を開始すると、状況が変わります。それが、この第 3 パラグラフで著者が伝えようとしていることですか?

4

2 に答える 2

1

CPU スラックなどの正式な用語はありません。作成者は単に、相互排他ロックを正常に取得するのを待つのにほとんどの時間が費やされているため、意味のある作業を行うために CPU が十分に活用されていないことを意味しています。筆者はCPUの未使用容量、CPUスラックと呼んでいます。

注: 関連するコードは、同じ数のプロデューサーとコンシューマーを使用して、複数のプロデューサー/複数のコンシューマーのシナリオをテストします。

編集: 後の議論では、a) スレッドがほとんど機能しない場合、および b) スレッドが生成または消費されるすべてのアイテムに対して実質的に CPU を占有する場合に、スレッドを追加することの効果について話します。少し人工的なシナリオで違いを説明しようと思います。

ロックには能動的に 1 時間単位、待機によって受動的に 8 時間単位かかるとします。受動待機は CPU を占有しません。

ケース 1: Producer-Consumer コストは 1 時間単位です。

そのため、現在、CPU 時間の 2 時間単位を占めており、さらに 8 時間単位の受動的な待機時間があります。したがって、8/10 の使用可能な CPU 時間単位があります。

スレッドの数を 2 倍にしたい場合は、追加の 2 つの時間単位に対応する必要があります (1 つは生産者と消費者のもの、もう 1 つはアクティブなロック時間です)。それは利用可能な CPU 時間の供給を食いつぶしますが、十分あります。

ケース 2: Producer-Consumer コストは 11 時間単位です。

したがって、現在、CPU 時間の 11+1=12 時間単位と、さらに 8 時間単位の受動的待機時間が計算されます。したがって、8/20 の使用可能な CPU 時間単位があります。

スレッドの数を 2 倍にしたい場合は、追加の 12 の時間単位に対応する必要があります (11 は生産者と消費者のものに、1 つはアクティブなロック時間に使用されます)。これは、使用可能な CPU 時間単位を超えています。何かを与える必要があるため、待ち時間が長くなり、スループットが低下します。

したがって、ケース 2 では、実際の作業量によって新しいスレッドに使用できる時間が減少するため、ロックの競合がスループットに与える影響が大きくなります。この想像シナリオの図も本に載っていたらよかったのに。そうすることで、彼らの手羽先の議論が理解しやすくなったでしょう。

于 2013-09-15T06:07:36.497 に答える
-1

CPUスラックがリソースだと思います。ウィキペディアによると、ジョブが今開始された場合、ジョブの後に残った時間のことを指します。十分な CPU スラックは、多くの計算リソースを意味します。コンシューマー/プロデューサーが重要な処理を行うと、CPU のスラックが減少し、スループットに影響を与えます。

于 2014-09-12T05:44:55.383 に答える