限制容器的内存使用量与限制容器内JVM进程的内存使用量?哪个更好?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了限制容器的内存使用量与限制容器内JVM进程的内存使用量?哪个更好?相关的知识,希望对你有一定的参考价值。
我有一个容器,我在其中运行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
- 限制容器内存。现在,JVM将在计算要消耗的内存量时使用cgroup。
值得一提的是,-XX:MaxRAMFraction=2
应根据您的应用程序,负载和运行的线程数进行调整。
来自fabric8的人已经制作了a great job来制作计算容器内存的图像,并使用cca 50%的总内存作为最大允许值(我认为这也可以调整)。这也适用于java 7。
以上是关于限制容器的内存使用量与限制容器内JVM进程的内存使用量?哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章