web-dev-qa-db-ja.com

-XX:MaxRAMFraction = 1はコンテナ環境での生産に安全ですか?

Java 8/9は、-XX:+UseCGroupMemoryLimitForHeap-XX:+UnlockExperimentalVMOptionsを使用)のサポートをもたらしました。これにより、-XX:MaxRAMがcgroupのメモリ制限に設定されます。 -XX:MaxRAMFractionのデフォルトは4であるため、JVMはデフォルトで最大RAMの約25%を割り当てます。

例:

MaxRAM = 1g
MaxRAMFraction = 4
JVM is allowed to allocate: MaxRAM / MaxRAMFraction = 1g / 4 = 256m

クォータの25%のみを使用することは、(通常)単一のJVMプロセスで構成されるデプロイメントの無駄のように思えます。そのため、人々は-XX:MaxRAMFraction=1を設定するので、理論的にはJVMがMaxRAMの100%を使用することが許可されます。

1gの例では、多くの場合、ヒープサイズは約900mになります。これは少し高いようです-JVMやリモートシェルやアウトプロセスタスクのような他のもののための空きスペースはあまりありません。

したがって、この構成(-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1)は、prodまたはベストプラクティスにとっても安全であると考えられていますか?または、-Xmx-Xms-Xssなどを引き続き手動で選択する必要がありますか?

27
atamanroman

-XX:MaxRAM=$QUOTAおよび-XX:MaxRAMFraction=1を設定すると、負荷のかかったコンテナが強制終了されることを示すいくつかの簡単なテストを行いました。 JVMは900Mを超えるヒープを割り当てますが、これは多すぎます。 -XX:MaxRAMFraction=2は安全なようです(ish)。

デバッグシェル(docker exec)の取得やコンテナ内の診断など、他のプロセスの余裕を残したい場合があることに留意してください。


編集: 記事 で詳細に学んだことを書きました。お金の相場:

TL'DR:Javaメモリ管理と構成は依然として複雑です。 JVMはJava 9/8u131以降、cgroupのメモリ制限を読み取り、それに応じてメモリ使用量を調整できますが、それは黄金の弾丸ではありません。 -XX:+UseCGroupMemoryLimitForHeapが何をするのかを知る必要があり、すべての展開でいくつかのパラメーターを微調整する必要があります。そうしないと、リソースとお金を無駄にしたり、最悪の場合にコンテナを殺してしまう危険があります。 -XX:MaxRAMFraction=1は特に危険です。 Java 10+は多くの改善をもたらしますが、それでも手動設定が必要です。安全のために、ロードテストを行ってください。

そして

最もエレガントなソリューションは、Java 10+にアップグレードすることです。 Java 10は-XX:+UseCGroupMemoryLimitForHeap(11)を非推奨にし、-XX:+UseContainerSupport(12)を導入します。これはそれを置き換えます。また、0〜100の値を取る-XX:MaxRAMPercentage(13)も導入します。これにより、JVMが割り当てることができるRAMの量をきめ細かく制御できます。 +UseContainerSupportはデフォルトで有効になっているため、すべてがすぐに動作するはずです。


編集#2: もう少し書きました about -XX:+UseContainerSupport

Java 10は+UseContainerSupport(デフォルトで有効)を導入し、JVMがコンテナ環境で正常なデフォルトを使用するようにしました。この機能は8u191以降Java 8にバックポートされており、野生のJavaデプロイメントのかなりの割合がメモリを適切に構成できる可能性があります。

24
atamanroman

最近のOracle-jdk-8(8u191)には、DockerコンテナユーザーがJavaヒープに使用されるシステムメモリの量をよりきめ細かく制御できるようにする次のオプションが用意されています。

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

DockerコンテナユーザーがJavaヒープに使用されるシステムメモリの量をよりきめ細かく制御できるように、3つの新しいJVMオプションが追加されました。

-XX:InitialRAMPercentage -XX:MaxRAMPercentage -XX:MinRAMPercentageこれらのオプションは、非推奨の分数形式(-XX:InitialRAMFraction、-XX:MaxRAMFraction、および-XX:MinRAMFraction)を置き換えます。

https://www.Oracle.com/technetwork/Java/javase/8u191-relnotes-5032181.html を参照してください

10
a.l.