【问题标题】:Restricting memory usage for container vs restricting memory usage of JVM process inside the container? Which is better?限制容器的内存使用与限制容器内 JVM 进程的内存使用?哪个更好?
【发布时间】:2018-08-30 21:36:23
【问题描述】:

我有一个容器,我在里面运行 6 个进程。还有 3 个其他容器也在做同样的事情。如果分配给组的大小是 30 GB,我看到几乎整个 RAM 都被填满了,尽管它只占用了 25 GB 的物理内存。

所以我决定限制。我应该限制什么?我应该将每个容器限制为每个 8 GB 吗?还是应该使用-XX:MaxRamFraction=xx 限制分配给每个进程的RAM?

第一种情况是限制容器,第二种情况是限制分配给每个进程的 RAM。哪个更好?为什么?

【问题讨论】:

    标签: docker jvm


    【解决方案1】:

    你应该两者都做。因为 JVM 是 docker 之前的并且不能与 cgroups 一起使用(更多信息 here),它不会“看到”你对容器设置的限制,并且会尝试使用超出其应有的范围。这已在 Java9+ 中修复,其中 JVM 适用于容器。下面的修复适用于java:8u172b111 及更高版本。

    1. 使用java:8u172b111 获取Docker 映像(例如anapsix/alpine-java:8u172b11_jdk
    2. 使用以下值添加JAVA_OPTS

    -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2

    1. 限制容器内存。现在,JVM 在计算消耗多少内存时将使用 cgroups。

    值得一提的是-XX:MaxRAMFraction=2 应该根据您的应用程序、负载和运行的线程数进行调整。

    fabric8 的人已经完成了a great job 在制作计算容器内存的图像并使用 cca 总内存的 50% 作为最大允许(我认为这也可以调整)。这也适用于 java 7。

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 2021-09-18
      • 1970-01-01
      • 2017-09-13
      • 2016-06-12
      • 2021-03-29
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      相关资源
      最近更新 更多