Linux および Windows 上の Java でスレッド アフィニティをサポートするライブラリがあります。https://github.com/peter-lawrey/Java-Thread-Affinity
CPUを分離すると、割り当てたCPUが他のもの(マスク不可能な割り込み以外)に使用されないようにすることができます。これは、LinuxのAFAIKで最適に機能します。
ブロッキング IO よりも非ブロッキング NIO でビジー待機を使用すると、より低いレイテンシーの結果を得ることができます。後者は負荷がかかった状態で最適に機能しますが、負荷が低いとレイテンシが増加する可能性があります。
このライブラリは興味深いかもしれませんhttps://github.com/peter-lawrey/Java-Chronicleを使用すると、1 秒あたり数百万のメッセージを、オプションで 2 番目のプロセスに永続化できます。
ところで:スレッドの優先度は単なるヒントです。OSはそれを自由に無視できます(そしてしばしば無視します)
ウォーム コードとコールド コードを比較する簡単な例。配列を繰り返しコピーして時間を計るだけです。コードとデータがウォームアップされると、遅くなるとは思わないでしょうが、コピーにかかる時間を大幅に遅くするには、かなりのマシンでも 10 ミリ秒の遅延が必要です。
public static void main(String... args) throws InterruptedException {
int[] from = new int[60000], to = new int[60000];
for (int i = 0; i < 10; i++)
copy(from, to); // warm up
for (int i = 0; i < 10; i++) {
long start = System.nanoTime();
copy(from, to);
long time = System.nanoTime() - start;
System.out.printf("Warm copy %,d us%n", time / 1000);
}
for (int i = 0; i < 10; i++) {
Thread.sleep(10);
long start = System.nanoTime();
copy(from, to);
long time = System.nanoTime() - start;
System.out.printf("Cold copy %,d us%n", time / 1000);
}
}
private static void copy(int[] a, int[] b) {
for (int i = 0, len = a.length; i < len; i++)
b[i] = a[i];
}
版画
Warm copy 20 us
Warm copy 20 us
Warm copy 19 us
Warm copy 23 us
Warm copy 20 us
Warm copy 20 us
Cold copy 100 us
Cold copy 80 us
Cold copy 89 us
Cold copy 92 us
Cold copy 80 us
Cold copy 112 us