LoginSignup
0
0

More than 1 year has passed since last update.

Docker in Javaのメモリ消費がコンテナの制限を超えていた話

Posted at

発端

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

お疲れ様でした。

何故あのディレクトリをマウントしていたのかが思い出せない・・・・

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0