0

シングル コア マシンは 1 つのスレッドしか実行できないという仮定から始めています。今、20 のスレッドを生成し、BigDecimal を使用して多数の階乗を計算する Java/Spring ベースの junit テストを作成しました。

Visual VM でその junit を監視したところ、20 個のスレッドすべてが動作していることを確認でき、Visual VM で実行中 (緑) として表示されます。私が理解しているように、jvm はそれらがすべて実行されているように見えますが、非常に細かいレベルでは、各スレッドが CPU サイクルを順番に処理します。すべてのスレッドが互いに干渉し、CPU があるスレッドから別のスレッドに切り替わることを視覚的または数値で証明する方法またはツールはありますか? つまり、特定の関数を実行する特定の数のスレッドについて、CPU による極端なコンテキストの切り替えによる飽和点または収益の減少を確認したいと考えています。

私が解決しなければならない実際の問題は、大規模な Java アプリケーションでスレッドを調整することです。サンプルの実行でスレッドの競合が見られない場合は、大規模なアプリケーションでもスレッドの競合や乱用を確認できません。

4

1 に答える 1

1

すべてのスレッドが互いに干渉し、CPU があるスレッドから別のスレッドに切り替わることを視覚的または数値で証明する方法またはツールはありますか?

短い答えは「いいえ」です。Linux システムの場合、拡張出力にリストされている複製されたプロセスを調べることで、どのスレッドが実際に機能しているかを判断できるかもしれませんがps、それでも、その情報を有効にするために必要な解決策を得ることができるとは思えません。 . 次に、十分に高速にサンプリングしていると、監視しようとしていたボックスのパフォーマンスに劇的な影響を与えるという Hiezenberg 問題があります。各スレッドが使用されている CPU 時間を調べて、何らかの判断を下すことができますが、その CPU 時間にはコンテキスト スイッチのオーバーヘッドが含まれる場合があります。

アプリケーションの最適なスレッド数を把握しようとしている場合は、さまざまなスレッド プール サイズの最適なスループットを判断するために、多数のテストを実行することをお勧めします。もちろん、アーキテクチャを切り替える場合は、CPU、コア、メモリなどに大きく依存するため、テストを再実行する必要があります.

于 2013-05-01T20:03:03.807 に答える