[Java] Java SE support for Docker CPU and memory limits

原文はこちら。
https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits

複数のOpenJDKプロジェクトにコントリビュートしてくれているCharlie Huntがこのようなすばらしいエントリを書いてくれました。とても感謝しています。
Charlie Hunt
http://openjdk.java.net/census#huntch 
Alpine LinuxにJDKのポートを提供するプロジェクトであるOpenJDK Project Portolaを発表したブログのフォローアップとして、Java SEの機能強化がなされました。
Official Docker Image for Oracle Java and the OpenJDK Roadmap for Containers
https://blogs.oracle.com/developers/official-docker-image-for-oracle-java-and-the-openjdk-roadmap-for-containers
[Docker, Java] Official Docker Image for Oracle Java and the OpenJDK Roadmap for Containers
https://orablogs-jp.blogspot.jp/2017/05/official-docker-image-for-oracle-java.html
Portola Project
http://openjdk.java.net/projects/portola/
OpenJDK
http://openjdk.java.net/
Alpine Linux
https://alpinelinux.org/
これはDockerとAlpine Linuxのスローガン「Small、Simple、Secure」にも合致します。今回言及するのは以下の2個です。
  • Docker CPUとメモリ制限のサポート
  • Project Jigsawのjlink。このツールを使って、アプリケーションが利用もしくは必要とするモジュールベースの最小限のJREを作成することができます(jlinkについては今後このエントリで紹介予定です)。
    Project Jigsaw
    http://openjdk.java.net/projects/jigsaw/
    JEP 282: jlink: The Java Linker
    http://openjdk.java.net/jeps/282
Oracle Server JREのDockerイメージはDocker Storeから利用いただけます。
Oracle Java 8 SE (Server JRE)
https://store.docker.com/images/oracle-serverjre-8

Java SE support for Docker CPU and memory limits

JavaアプリケーションでDockerのCPUとメモリの制限を使用してきた人にとって、いくつかの課題がありました。特にCPUの制限は、JVMがGCスレッド数とJITコンパイラスレッド数を内部で透過的に設定するため、課題となっていましたが、これらの値をコマンドラインオプションの-XX:ParallelGCThreads-XX:CICompilerCountで明示的に設定することができます。メモリ制限については、JVMコマンド行オプション-Xmxを使用して、最大Javaヒープ・サイズを明示的に設定することもできます。しかしながら、前述のJVMコマンドラインオプションを指定せず、Java SE 8u121以前のバージョンを使うJavaアプリケーションがDockerコンテナ上で動作する場合、GCスレッド数やJITコンパイラスレッド数、使用する最大Javaヒープサイズを透過的に決定する際に、JVMはDockerが動作するホストのCPUやメモリの構成を使います。

Java SE 8u131およびJDK 9以降、DockerのCPU制限に関してJVMは透過的にDockerを認識しています。つまり、-XX:ParalllelGCThreadsまたは-XX:CICompilerCountがコマンドラインオプションとして指定されていない場合、JVMはDocker CPU制限を、JVMがシステム上で認識するCPUの数として適用します。そしてJVMは、DockerのCPU制限として設定されてる個数のCPUが載っているベアメタルシステム上で動作しているかのように、GCスレッド数とJITコンパイラスレッド数を調整します。-XX:ParallelGCThreadsまたは-XX:CICompilerCountがJVMコマンドラインオプションで指定されていて、DockerのCPU制限が指定されている場合、JVMは-XX:ParallelGCThreadsおよび-XX:CICompilerCountの値を使用します。

Dockerのメモリ制限について、最大Javaヒープの透過的な設定に対する作業がもうすこし必要です。-Xmxを使って最大Javaヒープサイズを設定していない場合に、JVMに対しDockerのメモリ制限を認知するよう指示するには、次の2個のコマンドラインオプションが必要です。
-XX:+UnlockExperimentalVMOptions
-XX:+UseCGroupMemoryLimitForHeap
将来のリリースでDockerメモリ制限の透過的な認知を目標としているため、-XX:+UnlockExperimentalVMOptions が必要です。これら2個のJVMコマンドラインオプションを使い、 -Xmx を指定しない場合には、JVMはLinux cgroupの設定(Dockerコンテナがメモリ制限の設定のために利用)を見て、透過的に最大Javaヒープサイズを設定します。参考までに、DockerコンテナもまたCPU制限のためにcgroupsの設定を使います。

Java SE 8u131およびJDK 9でのこれらの2個の変更で、DockerでのJavaの実行体験の改善が期待されます。
8u131 Update Release Notes
http://www.oracle.com/technetwork/java/javase/8u131-relnotes-3565278.html
JDK 9
http://openjdk.java.net/projects/jdk9/

これらの機能強化の作業は両方ともOpenJDKでトラッキングされています。

0 件のコメント:

コメントを投稿