web-dev-qa-db-ja.com

プロセッサあたりのスレッド

Javaでは、CPUによってサポートされている同時スレッドの数をプログラムで確認する方法はありますか?

更新

明確にするために、私はスレッドでCPUをハンマーで叩こうとはしていません。また、探している情報の一部を提供するRuntime.getRuntime()。availableProcessors()関数を知っています。

次のようにスレッドプールのサイズを自動的に調整する方法があるかどうかを調べたいと思います。

  • 1年前のサーバーで実行している場合、2つのスレッドを取得します(CPUごとに1つのスレッドx 2の任意の乗数)
  • 2年後にInteli7クアッドコア(コアあたり2スレッドをサポート)に切り替えると、16スレッド(CPUあたり2論理スレッドx 4 CPU x任意の乗数2)が得られます。
  • 代わりに、8コアのUltrasparc T2サーバー(コアあたり8スレッドをサポート)を使用すると、128スレッド(CPUあたり8スレッドx 8 CPU x任意の乗数2)が得られます。
  • 同じソフトウェアを30台の異なるマシンのクラスターに展開し、異なる年に購入する可能性がある場合、CPU仕様を読んで、それらのすべてに構成オプションを設定する必要はありません。
24
Leo

Runtime.availableProcessorsは、物理コアではなく、論理プロセッサ(つまり、ハードウェアスレッド)の数を返します。 CR 5048379 を参照してください。

24

単一の非ハイパースレッディングCPUコアは、常に1つのスレッドを実行できます。たくさんのスレッドをスポーンすることができ、CPUはそれらを切り替えます。

最適な数はタスクによって異なります。多くのCPUパワーを必要とし、I/Oを必要としないタスク(円周率、素数の計算など)の場合は、CPUごとに1スレッドがおそらく最適です。タスクがより多くのI/Oバウンドである場合。ディスクからの情報を処理するのと同じように、CPUごとに複数のスレッドを使用することでパフォーマンスが向上する可能性があります。この場合、CPUが前のディスク読み取りからの情報を処理している間に、ディスクアクセスが発生する可能性があります。

状況のパフォーマンスがCPUコアあたりのスレッド数に応じてどのようにスケーリングするかをテストし、それに基づいて決定することをお勧めします。次に、アプリケーションの実行時に、availableProcessors()をチェックして、生成するスレッドの数を決定できます。ハイパースレッディングにより、単一のコアがオペレーティングシステムとavailableProcessors()を含むすべてのアプリケーションに2つのCPUとして表示されるため、アプリケーションでハイパースレッディングを使用できる場合はメリットがあります。そうでない場合、パフォーマンスはわずかに低下しますが、おそらくそれを提供するための余分な努力をするのに十分ではありません。

19
pipTheGeek

Java内のCPUコアごとにサポートされているスレッドの数を取得する標準的な方法はありません。最善の策は、プロセッサ情報を提供するJava CPUIDユーティリティを取得し、プロセッサが管理するコアごとのスレッドを提供する、生成する必要のあるテーブルと照合することです。 「実際の」コンテキストスイッチなし。

-アダム

4
Adam Davis

基本:メモリにロードされるアプリケーションはプロセスです。プロセスには少なくとも1 threadがあります。必要に応じて、プロセスで必要な数のスレッドを(理論的に)作成できます。したがって、スレッドの数は、ユーザーと使用するアルゴリズムによって異なります。

thread poolsを使用する場合、スレッドの作成はリソースを消費するため、スレッドプールがスレッドの数を管理することを意味します。スレッドプールはスレッドをリサイクルします。これは、多くの論理スレッドが1つの物理スレッド内で次々に実行できることを意味します。

スレッド数を考慮する必要はありません。スレッドプールアルゴリズムによって管理されます。スレッドプールは、サーバーとデスクトップマシン(OS)に異なるアルゴリズムを選択します。

Edit1:スレッドプールがリソースを使用していないと思われる場合は、明示的なスレッドを使用できますあなたが持っている。その場合、スレッドの数を明示的に管理できます。

1
artur02

各プロセッサ、またはプロセッサコアは、一度に1つのことを実行できます。ハイパースレッディングを使用すると、状況は少し異なりますが、ほとんどの場合、それは依然として当てはまります。そのため、稼働中のHTマシンが50%を超えることはほとんどなく、100%であっても、一度に2倍の処理を行うことはありません。 。

おそらく、デプロイする予定の一般的なアーキテクチャでいくつかのテストを実行して、各CPUで実行するスレッドの数を決定する必要があります。大量のI/Oを待っている場合は、1つのスレッドを使用するだけでは遅すぎる可能性があります。プロセッサがスレッドをより頻繁に切り替える必要があるため、多数のスレッドを実行すると処理速度が低下し、非常にコストがかかる可能性があります。実行できるスレッド数にハードコードされた制限があるかどうかはわかりませんが、ハード制限に達する前に、スレッドの切り替えが多すぎるためにアプリがクロールする可能性があることを保証します。最終的には、構成ファイルのオプションとして残すだけで、実行しているプロセッサに合わせてアプリを簡単に調整できます。

1
Kibbee

通常、CPUはスレッド数に制限を設けておらず、Java自体が生成するネイティブ(カーネル)スレッドの数に制限があるとは思いません。

Runtimeクラスにはメソッド availableProcessors() があります。それはあなたが探しているものですか?

1
JesperE

これはVMの機能であり、CPUの機能ではありません。これは、スレッドごとに消費されるヒープの量と関係があります。ヒープ上のスペースが不足すると、完了です。他のポスターと同様に、スレッド数が原因でヒープスペースを超えると、この時点より前にアプリが使用できなくなると思われます。

これを参照してください ディスカッション

0
tvanfosson