複数のユーザーがJava 60コアコンピューティングサーバー上でアプリケーションを実行しています(Linux/Ubuntuベース)。さまざまなアプリケーションがあり、それらのほとんどは社内で開発されていません。
システム管理者は、特定のユーザーのJavaプロセスが常に10コアを使用することは問題ないと考えていますが、10を超えないようにしたいと考えています。
Javaまたはプロセスが計算リソースを無制限に取得するのを防ぐために使用できるOS構成はありますか?
このビデオは一見の価値があると思います。 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のみが構成されている場合、システム(コンテナー内にあるかどうかに関係なく)。