8.4.2. OpenShift Container Platform の OpenJDK 設定について
クラスター内で OpenJDK アプリケーションを効果的にデプロイする方法については、以下のコンセプトを参照してください。
デフォルトの OpenJDK 設定はコンテナー化された環境では機能しません。そのため、コンテナーで OpenJDK を実行する場合は常に追加の Java メモリー設定を指定する必要があります。
JVM のメモリーレイアウトは複雑で、バージョンに依存しており、この詳細はこのドキュメントでは説明しません。ただし、コンテナーで OpenJDK を実行する際のスタートにあたって少なくとも以下の 3 つのメモリー関連のタスクが主なタスクになります。
- JVM 最大ヒープサイズをオーバーライドする
OpenJDK は、デフォルトで、使用可能なメモリーの最大 25% を heap メモリーに使用します。その際、コンテナーに設定されたメモリー制限も考慮されます。このデフォルト値は保守的な値であり、適切に設定されたコンテナー環境では、コンテナーに割り当てられたメモリーの 75% がほとんど使用されずに済むことになります。コンテナーレベルでメモリー制限が課されるコンテナーコンテキストでは、JVM がヒープメモリーに使用する割合を 80% などかなり高く設定する方が適しています。
ほとんどの Red Hat コンテナーには、JVM の起動時に値を更新して OpenJDK のデフォルト設定を置き換える起動スクリプトが含まれています。
たとえば、Red Hat build of OpenJDK コンテナーのデフォルト値は 80% です。この値は、
JAVA_MAX_RAM_RATIO環境変数を定義することで異なるパーセンテージに設定できます。その他の OpenJDK デプロイメントの場合、次のコマンドを使用してデフォルト値の 25% を変更できます。
例:
$ java -XX:MaxRAMPercentage=80.0- JVM が未使用メモリーをオペレーティングシステムに解放するよう促す (適切な場合)。
デフォルトで、OpenJDK は未使用メモリーをオペレーティングシステムに積極的に返しません。この設定は、コンテナー化された多くの Java ワークロードに適していますが、注目すべき例外もあります。具体的には、ネイティブプロセス、追加の JVM、あるいはその両方の組み合わせなど、JVM 以外のプロセスが同じコンテナー内で共存するワークロードがその例外に該当します。
Java ベースのエージェントは、次の JVM 引数を使用して、JVM が未使用のメモリーをオペレーティングシステムに解放するように促すことができます。
-XX:+UseParallelGC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90これらの引数は、割り当てられたメモリーが使用中のメモリー (
-XX:MaxHeapFreeRatio) の 110% を超え、ガベージコレクター (-XX:GCTimeRatio) での CPU 時間の 20% を使用する場合は常にヒープメモリーをオペレーティングシステムに返すことが意図されています。アプリケーションのヒープ割り当てが初期のヒープ割り当て (-XX:InitialHeapSize/-Xmsでオーバーライドされる) を下回ることはありません。詳細は、Tuning Java’s footprint in OpenShift (Part 1)、Tuning Java’s footprint in OpenShift (Part 2)、および OpenJDK and Containers を参照してください。- コンテナー内のすべての JVM プロセスが適切に設定されていることを確認する
複数の JVM が同じコンテナーで実行される場合、それらすべてが適切に設定されていることを確認する必要があります。多くのワークロードでは、それぞれの JVM に memory budget のパーセンテージを付与する必要があります。これにより大きな安全マージンが残される場合があります。
多くの Java ツールは JVM を設定するために各種の異なる環境変数 (
JAVA_OPTS、GRADLE_OPTSなど) を使用します。適切な設定が適切な JVM に渡されていることを確認するのが容易でない場合もあります。JAVA_TOOL_OPTIONS環境変数は OpenJDK によって常に考慮されます。JAVA_TOOL_OPTIONSで指定した値は、JVM コマンドラインで指定した他のオプションによってオーバーライドされます。デフォルトでは、Java ベースのエージェントイメージで実行されるすべての JVM ワークロードでこれらのオプションがデフォルトで使用されるように、OpenShift Container Platform Jenkins Maven エージェントイメージは次の変数を設定します。JAVA_TOOL_OPTIONS="-Dsun.zip.disableMemoryMapping=true"
この設定は、追加オプションが要求されないことを保証する訳ではなく、有用な開始点になることを意図しています。コンテナーでの実行に向けて JVM ワークロードを最適に調整する方法はこのドキュメントでは扱いませんが、これには複数の JVM オプションを追加で設定することが必要になる場合があります。