27

Java で、CPU がサポートする同時スレッド数をプログラムで調べる方法はありますか?

アップデート

明確にするために、私はスレッドで CPU を叩こうとしているのではなく、探している情報の一部を提供する Runtime.getRuntime().availableProcessors() 関数を認識しています。

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

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

7 に答える 7

28

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

于 2008-10-19T07:07:22.903 に答える
21

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

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

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

于 2008-10-18T16:48:35.803 に答える
4

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

于 2008-10-18T21:53:00.277 に答える
2

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

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

于 2008-10-18T17:42:54.430 に答える
1

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

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

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

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

于 2008-10-18T17:34:22.700 に答える
1

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

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

于 2008-10-18T16:42:58.793 に答える
0

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

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

于 2008-10-18T16:50:38.500 に答える