同じ Linux マシンで実行され、TCP 経由でメッセージを送受信する Java アプリケーションがいくつかあります。ServerSocket と Socket を使用して接続を作成します。この通信の遅延をできるだけ減らしたい。ボックスにコアを割り当てて、そのパフォーマンスを向上させる継続的な TCP ポーリングを実行できるようです。Linux や Java ではどのように行われますか?
2 に答える
これを実現する方法はありますが、移植可能ではありません。
1) ネイティブ スレッド ID を調べる 2) ネイティブ スレッドのアフィニティを設定する
サポートされていないクラスを使用して、sun.jvm.hotspot の下のパッケージからネイティブ スレッド ID (Linux ではプロセス ID) を取得できます。これらのクラスにリンクするには、sa-jdi.jar (jdk にバンドルされている) をビルド パスに含めます。別のサイトから回答をコピーするのは好きではないので、githubの指示を読んでください。
ネイティブ スレッド ID を取得したら、'taskset' コマンド ライン ユーティリティを使用してアフィニティを変更する必要があります。別の投稿からタスクセットの使用方法の説明を見つけることができます
そうではありません。Java のコアにスレッドを割り当てる方法はありません。
また、単一のコアを割り当ててもパフォーマンスは向上しません。それどころか、それはおそらくそれを減らすでしょう。「ポーリング」の意味が正確にはわかりませんが、ソケットではできません。read() でブロックする別のスレッドを使用する必要があります。使用を検討しているInputStream.available()
場合は、間違ったツリーを完全に吠えており、セレクターで NIO を使用する必要があります。