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

时间:2018-08-30 10:49:04

标签: docker jvm

我有一个容器,并且其中正在运行6个进程。还有3个其他容器在做同样的事情。如果分配给该组的大小为30 GB,即使物理内存仅占用25 GB,我也会看到几乎整个RAM都已被填充。

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

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

1 个答案:

答案 0 :(得分:3)

您应该两者都做。因为JVM是docker之前的版本,并且不能与cgroups一起使用(更多信息here),所以它无法“看到”您对容器的限制,并尝试使用过多的限制。 Java9 +已修复了该问题,其中JVM适用于容器。该修正波纹管将适用于java:8u172b111及更高版本。

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

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

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

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

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