14

同様のトピックに関する以前の投稿を検索しましたが、適切な回答が見つからなかったため、この質問をしました。それに答えるあなたの助けは非常に高く評価されています。

Linux でタスクセット コマンドを使用して、プロセスのアフィニティを特定の CPU コアに設定することを認識しています。しかし、Java スレッドのアフィニティーを特定の CPU コアに設定して、同じプロセスに属する他のスレッドが残りのすべてのコアで実行できるようにしたいと考えています。たとえば、4 コア マシンで 10 スレッドを含むプロセスがある場合、コア 1 をスレッド用に予約し、残りの 9 スレッドを残りの 3 コアで実行したいと考えています。それはどのように行うことができますか?

ありがとうサチン

4

4 に答える 4

11

2241はJavaプロセスのpidであると言います。走る:

jstack 2241

これにより、スレッドのリストが表示されます。そこであなたのものを見つけて、nidフィールドに注意してください。nid = 0x8e9と言います。これは、2281として10進数に変換されます。次に、次のコマンドを実行します。

taskset -p -c 0 2281

終わり。

于 2012-11-15T19:12:27.327 に答える
8

残念ながら、Java スレッドを特定のコアに割り当てることはできません。ただし、できることは、スレッドの優先度を設定てスレッドに優先順位を付けることです (これが同じことを達成すると仮定します)。

あるいは、JNI を使用することもできますが、それは完全にやり過ぎです。

于 2012-11-15T06:11:35.970 に答える
2

実行中の Java アプリケーションが実際に JVM で実行され、JVM が OS 上で実行されていることを思い出してください。CPU と直接対話できるようにするには、低レベルのプログラミング言語 (C など) が必要です。

別の回答で示唆されているように、JNI を使用して低レベル言語 (C など) とやり取りして、必要なことを行うことができますが、同時実行性 (その低レベル言語内で管理されるスレッド) を委任する必要があります...

于 2012-11-15T06:23:50.447 に答える
1

JNAを使用してプレーンJavaでそれを行うことができます。タスクセットを使用する必要はありません。事前にカーネル/ユーザー スレッドおよびハードウェア割り込みからコアを分離していない限り、スレッド アフィニティは無意味であることを覚えておいてください。私は、まさにそれを行うCoralThreadsを開発した Coral Blocks と提携しています。

于 2014-06-12T15:12:43.450 に答える