原文はこちら。
https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits
複数のOpenJDKプロジェクトにコントリビュートしてくれているCharlie Huntがこのようなすばらしいエントリを書いてくれました。とても感謝しています。
Java SE 8u131およびJDK 9以降、DockerのCPU制限に関してJVMは透過的にDockerを認識しています。つまり、
Dockerのメモリ制限について、最大Javaヒープの透過的な設定に対する作業がもうすこし必要です。
Java SE 8u131およびJDK 9でのこれらの2個の変更で、DockerでのJavaの実行体験の改善が期待されます。
これらの機能強化の作業は両方ともOpenJDKでトラッキングされています。
https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits
複数のOpenJDKプロジェクトにコントリビュートしてくれているCharlie Huntがこのようなすばらしいエントリを書いてくれました。とても感謝しています。
Charlie HuntAlpine LinuxにJDKのポートを提供するプロジェクトであるOpenJDK Project Portolaを発表したブログのフォローアップとして、Java SEの機能強化がなされました。
http://openjdk.java.net/census#huntch
Official Docker Image for Oracle Java and the OpenJDK Roadmap for ContainersこれはDockerとAlpine Linuxのスローガン「Small、Simple、Secure」にも合致します。今回言及するのは以下の2個です。
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 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 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個のコマンドラインオプションが必要です。将来のリリースでDockerメモリ制限の透過的な認知を目標としているため、-XX:+UnlockExperimentalVMOptions
-XX:+UseCGroupMemoryLimitForHeap
-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でトラッキングされています。
- getAvailableProcessors may incorrectly report the number of cpus in Docker container
https://bugs.openjdk.java.net/browse/JDK-8140793 - [linux] Experimental support for cgroup memory limits in container (ie Docker) environments
https://bugs.openjdk.java.net/browse/JDK-8170888 - physical memory does not see Docker resource limits
https://bugs.openjdk.java.net/browse/JDK-8146115