我有一个容器,我在其中运行6个进程。还有3个其他容器在做同样的事情。如果分配给该组的大小为30 GB,我发现几乎整个RAM都在填充,即使物理内存只需要25 GB。
所以我决定限制。我应该限制什么?我应该将每个容器限制为每个8 GB吗?或者我应该使用-XX:MaxRamFraction=xx
限制分配给每个进程的RAM?
第一种情况是限制容器,第二种情况是限制分配给每个进程的RAM。哪个更好?为什么?
你应该两个都做。因为JVM是预先停靠的并且不能与cgroups一起使用(更多信息here),所以它没有“看到”你对容器施加的限制并试图使用超过它的容量。这已通过Java9 +修复,其中JVM适用于容器。修复波纹管将适用于java:8u172b111
及以上。
java:8u172b111
获取Docker镜像(例如anapsix/alpine-java:8u172b11_jdk
)JAVA_OPTS
并使用以下值:-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2
值得一提的是,-XX:MaxRAMFraction=2
应根据您的应用程序,负载和运行的线程数进行调整。
来自fabric8的人已经制作了a great job来制作计算容器内存的图像,并使用cca 50%的总内存作为最大允许值(我认为这也可以调整)。这也适用于java 7。