2013-03-11 22 views
8

ThreadLocalのように動作するCoreLocalマップを実装したいのですが、現在のスレッドが実行されているコアに固有の値を返します。Javaスレッドが実行されているコアを特定するにはどうすればよいですか?

この理由は、キューからジョブを取得するコードを記述したいのですが、関連するデータが既にスレッドを選択しているスレッドと同じL1キャッシュにあるジョブに優先順位を付けたいキューからジョブを削除します。したがって、プログラム全体の1つのジョブ・キューではなく、各コアのキューを作成したい場合は、キューが空の場合にのみ、ワーカー・スレッドは他のコアのキューを調べます。

+3

https://github.com/peter-lawrey/Java-Thread-Affinity – bmargulies

+2

Q ==待ち行列? :\ –

+3

そこにはナノ秒であなたが本当に低いように聞こえる。 – djechlin

答えて

0

おそらくあなたは/proc/[pid]/status

これらのフィールドが役に立つかもしれチェックすることができ:

Cpus_allowed:前回と同じだが、「リストの中:このプロセスは

Cpus_allowed_listを実行する可能性がある上のCPUのマスク形式 "

1

回答が不十分なlinux questionがあります(構文解析top出力はカウントされず、受け入れられた回答はもう機能しません)。私は

/proc/<pid>/task/<tid>/sched 

current_node=0, numa_group_id=0 

のようなラインにこの情報を与えるかもしれないと思ったけど4.4.0-92-GENERICカーネルを実行している私のi5-2400に、この行は、常にすべてのスレッドで同じです。私は、 "ノード"はCPU(ソケット)全体を意味し、私は1つだけ持っていると思います。

これに関する文書は見つかりませんでしたが、this documentに届きませんでした。 procファイルシステムからの読み取り

  • は、あなたが取り組んでいる規模の費用がかかりすぎることがあります


    はしかし、私がこの情報を取得することimprobablyあなたを助けることができることを恐れています。

  • ThreadLocalとは異なり、CoreLocalはスレッドセーフではありません。スレッドを別のコアに移行すると、someCoreLocalField++のような些細な非アトミック操作でさえも損害を受ける可能性があります。それを中止することもそれをするでしょう。だから、アトミックやスレッド・ローカルが必要になります。それでは、あなたが望むものに対しては遅すぎるかもしれません。
0

それは確かにpreviously discussedproposed as a JDK enhancementてきましたが、私は、現在、JDKにさらさ現在のCPUを取得するための呼び出しがあるとは思いません。

私はそのような何かが実装されるまで、あなたの最善の策は、Linux上でgetcpuまたはWindows上のGetCurrentProcessorNumberのようなネイティブのシステムコールをラップするJNA(最も簡単)またはJNI(速い)のようなものを使用することだと思います。

少なくともLinuxでは、getcpuはカーネル移行なしでVDSOに実装されているため、JNI呼び出しには数ナノ秒と数ナノ秒かかるだけです。 JNAは遅いです。

実際ににスピードが必要な場合は、OpenJDKがオープンソースであるため、特製のJVMに組み込み関数として関数を追加することができます。それは数ナノセカンドを削るでしょう。

この情報は、取得するとすぐに期限切れになる可能性があるので、パフォーマンスや正確性のみにこの情報を頼るべきではありません。あなたは既に "間違った"値を取得するサポートを持っているので、別の考えられる方法は、CPU IDのキャッシュされた値をThreadLocalに保存し、それを定期的に更新することです。これにより、あまり頻繁ではないので、ファイルシステムの構文解析などのアプローチが遅くなります。最高の速度を得るには、各呼び出しで無効化条件をチェックするのではなく、スレッドスレッドから周期的にスレッドローカルを無効にすることができます。


議論およびエンハンスメント要求の両方が強く推奨読んでいます。

関連する問題