限制容器的内存使用量与限制容器内JVM进程的内存使用量?哪个更好?

问题描述 投票:2回答:1

我有一个容器,我在其中运行6个进程。还有3个其他容器在做同样的事情。如果分配给该组的大小为30 GB,我发现几乎整个RAM都在填充,即使物理内存只需要25 GB。

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

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

docker jvm
1个回答
3
投票

你应该两个都做。因为JVM是预先停靠的并且不能与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将在计算要消耗的内存量时使用cgroup。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.