発端
amazoncorretto:11ベースのコンテナでJava(Kotlin)のアプリケーションを稼働させました。
ホストサーバーのメモリは4G(実際に使用できるのは3.9G程度)
コンテナにはcpus: 2、mem_limit: 2.5gでリソースの制限をかけていました。
違和感
アプリケーションに負荷がかかるとメモリ使用率が2.5Gどころか3G超に、そしてサーバーが危篤(ピンチ)
危機が過ぎ去った後、開発環境で色々と検証
JDK11なのでUseContainerSupportがデフォルトオンになっているはずと思いこのようなソースを用意してコンテナ内で実行
A.java
public class A {
public static void main(String[] args) {
System.out.println("Version: " + System.getProperty("java.version"));
System.out.println("availableProcessors: " + Runtime.getRuntime().availableProcessors());
System.out.println("maxMemory: " + Runtime.getRuntime().maxMemory()/1024/1024 + "M");
}
}
結果は詳細に残すのを忘れてしまったのですが、
maxMemoryは980Mを記録
980M・・・?
2.5Gのコンテナにしては数値が大きいような・・・?
(デフォルトはメモリ/4の数値になる記憶)
ここから色々JVM argsを見直したりDockerfileを見直したりの日々
解決
docker-compose.ymlで以下のフォルダをマウントしていたことが原因
volumes:
- "./sys/fs/cgroup:/sys/fs/cgroup:ro"
この部分を削除してからコンテナ再起動
もう一度A.javaを実行
bash-4.2# java A
Version: 11.0.14
availableProcessors: 2
maxMemory: 640M
bash-4.2# java -XX:MaxRAMPercentage=50 A
Version: 11.0.14
availableProcessors: 2
maxMemory: 1280M
bash-4.2# java -XX:MaxRAMPercentage=75 A
Version: 11.0.14
availableProcessors: 2
maxMemory: 1920M
お疲れ様でした。
終
何故あのディレクトリをマウントしていたのかが思い出せない・・・・