我有一个容器,并且其中正在运行6个进程。还有3个其他容器在做同样的事情。如果分配给该组的大小为30 GB,即使物理内存仅占用25 GB,我也会看到几乎整个RAM都已被填充。
所以我决定限制。我应该限制什么?是否应将每个容器限制为8 GB?还是应该使用-XX:MaxRamFraction=xx
限制分配给每个进程的RAM?
第一种情况是限制容器,第二种情况是限制分配给每个进程的RAM。哪个更好?为什么?
答案 0 :(得分:3)
您应该两者都做。因为JVM是docker之前的版本,并且不能与cgroups一起使用(更多信息here),所以它无法“看到”您对容器的限制,并尝试使用过多的限制。 Java9 +已修复了该问题,其中JVM适用于容器。该修正波纹管将适用于java:8u172b111
及更高版本。
java:8u172b111
(例如anapsix/alpine-java:8u172b11_jdk
)获取Docker映像JAVA_OPTS
添加以下值: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2
值得一提的是,-XX:MaxRAMFraction=2
应该根据您的应用程序,负载和正在运行的线程数进行调整。
fabric8的用户在制作图像时已经a great job,这些图像计算了容器的内存并使用了允许的最大总内存的50%的cca(我认为这也可以调整)。这也适用于Java 7。