web-dev-qa-db-ja.com

Javaスレッドアフィニティ

Javaプロセスを特定のCPUコア(Linux上)内の個々のスレッドをロックダウンする方法を知っていますか?これをCで実行しましたが、これを行う方法が見つかりません。私の本能は、これにはJNI呼び出しが必要になるということですが、ここの誰かが何らかの洞察を持っているか、以前にそれをしたことを望んでいました。

ありがとう!

60
Dave

これを純粋なJavaで行うことはできません。しかし、本当に必要な場合は、JNIを使​​用して、ジョブを実行するネイティブコードを呼び出すことができます。これは、開始する場所です。

http://ovatman.blogspot.com/2010/02/using-Java-jni-to-set-thread-affinity.html

http://blog.toadhead.net/index.php/2011/01/22/cputhread-affinity-in-Java/

UPD:少し考えて、このために独自のクラスを作成することにしました: ThreadAffinity.Java それはJNAベースです、非常にシンプルです。したがって、本番環境で使用する場合は、より安定させるために少し時間をかける必要がありますが、ベンチマークとテストの場合はそのままで機能します。

UPD 2:Javaでスレッドアフィニティを操作するための別の library があります。前述の方法と同じ方法を使用しますが、別のインターフェースがあります

44
BegemoT

しばらく経っていることは知っていますが、誰かがこのスレッドに出くわした場合は、この問題をどのように解決しましたか。次のことを行うスクリプトを作成しました。

  1. 「jstack -l」
  2. 結果を取得して、手動でコアにロックダウンしたいスレッドの「nid」を見つけます。
  3. これらのスレッドをタスクセットします。
9
Dave
3
Vaibhav Kamble

それは不可能です(少なくともプレーンなJavaでは)。

thread pools を使用して、さまざまなタイプの作業に使用されるスレッド(およびコア)の量を制限できますが、使用するコアを指定する方法はありません。

JavaランタイムがOSまたはハードウェアのネイティブスレッドをサポートしていない可能性もあります。この場合、 緑のスレッド が使用され、 1つのコアがJVM全体に使用されます。

0
Hardcoded

IMO、これ しない ネイティブ呼び出しを使用しない限り可能です。 JVMはプラットフォームに依存しないと想定されており、これを実現するために実行されるシステムコールは移植可能なコードにはなりません。

0
questzen