2012-11-15 4 views
11

私は類似のトピックについて以前の投稿を検索しましたが、この質問をするのにふさわしい答えが見つかりませんでした。それに答えるあなたの助けは非常に高く評価されます。JavaスレッドのCPUコアアフィニティを設定するには?

私は、Linuxのtasksetコマンドによって特定のCPUコアにプロセスの親和性を設定していることに気付いています。しかし、特定のCPUコアにJavaスレッドの親和性を設定して、同じプロセスに属する他のスレッドを残りのコアすべてで実行できるようにします。たとえば、4コアマシンで10スレッドを含むプロセスがある場合、スレッド用にcore-1を予約し、残りの3コアで残りの9スレッドを実行させたいと思います。それはできますか?

おかげ サチンは

答えて

8

2241はJavaプロセスのpidです。実行:

jstack 2241 

スレッドの一覧が表示されます。そこにあなたを見つけ、nidフィールドに注意してください。 nid = 0x8e9とし、ベース10を2281と変換します。次に

taskset -p -c 0 2281 

完了します。

7

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

また、JNIを使​​用することもできますが、それは完全に過剰です。

+0

ええと、javaはハードウェアに依存しません – Furtano

2

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

他の答えで示唆されているように、JNIを使​​用して低レベル言語(Cのような)と対話して、並行性(その低レベルのlangagugeで管理されているスレッド)を委譲する必要があります。

0

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

関連する問題