通常、アプリケーションの実行に使用されるCPUやコアを指定するのはオペレーティングシステムです。 アプリケーションが必要とするスレッド数と他のアプリケーションにより、OSは必要に応じてスレッドを移動させ、各CPUの全体的な負荷を均衡させます。 CPUよりスレッドの数が多いい場合(標準)、OSはCPUを複数のスレッド間で共有します。つまり、各スレッドは実行されるまで一時停止されます。 アプリケーションによっては、この方法が正しく動作しないことがあり、特定のCPUやCPUグループを指定のアプリケーションに制限させると便利です。 ほとんどのOSプラットフォームで一つのプロセスが特定のCPU上でのみ実行されるように指定できます。 これは、一般的に、CPUアフィニティ、若しくはCPUピニングと呼ばれます。
アプリケーションに特定のCPUを割り当てることで常にCPUリソースが十分に確保される方法です。 逆に、同じマシン上で実行される他のプロセスに十分なリソースを保証するために、いくつかのプロセッサを明示的に使用せず、待機させることができます。 プロセッサアフィニティを設定することで、CPUキャッシュを大幅に最適化することもできます。 つまり、プロセスがCPUを変更するたびに、そのデータがあるCPUから別のCPUに転送されます。 この転送にはコストがかかりますが、限られた数のCPUにプロセスを固定することで最小限に抑えることができます。 ただし、使用可能な時にアプリケーションが異なるCPUで並列タスクを実行することもありますので、十分なプロセッサを使用できるよう、設定する注意が必要です。
残念ながら、Javaはコア若しくはプロセッサの親和性でJVMを起動するソリューションを提供していません。 Javaアプリケーションを特定のCPUに固定する必要がある場合は、procaff、taskset や invoke native codeなどのコマンドを使用する必要があります。 これらのソリューションはプラットフォーム特有です。
解決! |
Java Service Wrapper プロフェッショナル版は、コードを書かかずCPUアフィニティを統一的で簡単に設定できるようにすることで、この問題に対処しています。 Wrapper バージョン 3.5.27まで、WindowsとLinuxしかサポートされていませんが、近来リリースにも他のプラットフォームをサポートする予定です。 この設定では、Wrapperプロセスと制御されたJVMプロセスを対象にすることができます。 それぞれにはプロセッサアフィニティを設定するための独自のプロパティーはありますが、Wrapperのプロパティのみを指定すると、デフォルトで制御されたJVMプロセスは同じ設定を継承し、自動的にWrapperプロセスと同じCPUで実行されます。 |
技術概要 |
||||||||||||||||||||||||||
|