web-dev-qa-db-ja.com

Java:JVMが使用できるコアの数を制限する

複数のユーザーがJava 60コアコンピューティングサーバー上でアプリケーションを実行しています(Linux/Ubuntuベース)。さまざまなアプリケーションがあり、それらのほとんどは社内で開発されていません。

システム管理者は、特定のユーザーのJavaプロセスが常に10コアを使用することは問題ないと考えていますが、10を超えないようにしたいと考えています。

Javaまたはプロセスが計算リソースを無制限に取得するのを防ぐために使用できるOS構成はありますか?

6
oggotron

OSフロント:

  • 古典的な方法は、CPUアフィニティをtasksetに設定することです。

  • より良い代替手段は cgroups を使用することです。

  • そして、話題のWordソリューションは、アプリケーションを Docker コンテナーで実行することです。ただし、Java 8の前は、JVMはDockerによって課された制限を理解できません(8u131 +がバックポートされた後でのみ使用可能、CPU部分のJava9で実験的に使用できるかどうかは不明ですが、それはメモリ用であり、Java10で完全に利用可能です)

3
HBruijn

このビデオは一見の価値があると思います。 https://vimeo.com/181900266

Java対cgroups対コンテナー)、およびJVMがCPUの数などを検出する方法について非常に優れた概要を提供します。

これに基づいて、Java 8までは、JVMがウェイで利用可能なCPUの数を決定し、常にすべての「オンライン」CPUが利用可能であると見なします。この目的のためにsysconf(_SC_NPROCESSORS_ONLN)を使用しますcgroupされている場合やコンテナーに配置されている場合でも。

From Java 9 JVMはsched_getaffinity()を使用し、cpusetを使用してJVMのCPUの数を制御する場合に役立ちます。つまり、JVMは構成されたCPUのみを表示します。たとえば、 Dockerのcpuset-cpusオプションを使用すると、実際にはJVMの制限が作成されます。注意!cpushareがJVMに構成されている場合でも、問題の解決策は提供されません。JVMは引き続きすべてのCPUを認識しますcpushareのみが構成されている場合、システム(コンテナー内にあるかどうかに関係なく)。

2
janosi