限制容器的内存使用量与限制容器内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及以上。

  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。

以上是关于限制容器的内存使用量与限制容器内JVM进程的内存使用量?哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章

容器中的JVM资源该如何被安全的限制?

重学容器31: 容器资源限制之限制容器的内存

如何设置Docker容器中Java应用的内存限制

Docker容器生产实践1——永远设置容器内存限制

JDK对容器的支持和限制

容器内存增加jvm不高