cgroup v2 和 java 8

cgroup v2 and java 8

我们 运行 在切换我们的基础 jdk 图像和升级 k8s 后突然遇到问题,特别是我们想使用 eclipse-temurin:8u312-b07-jdk。这是一个非常简单的例子:

kubectl run jdk --image eclipse-temurin:8u312-b07-jdk --limits "memory=2Gi"
kubectl exec jdk -it -- /bin/bash
nano Dummy.java

内容:

import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.TimeUnit;
public class Dummy {
   public static void main(String[] args) throws Exception {
       while(true) {
           LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
       }
   }
}

编译并运行它:

javac Dummy.java
java -XX:+UnlockExperimentalVMOptions  -XX:+UseCGroupMemoryLimitForHeap Dummy

然后我们收到警告:

OpenJDK 64-Bit Server VM warning: Unable to open cgroup memory limit file /sys/fs/cgroup/memory/memory.limit_in_bytes (No such file or directory)

嗯,是的。没有这样的文件,但是有 cat /sys/fs/cgroup/memory.max (cgroup v2).

那是不是说UseCGroupMemoryLimitForHeap就没有效果了?它看起来确实像。我知道它在 11 中已被弃用和删除 - 这不是重点。

谢谢。


我做到了find this issue 看起来我可以做到:

java -XX:+UnlockExperimentalVMOptions -XX:MaxRAM=$(cat /sys/fs/cgroup/memory.max)  Dummy

但这不是我真正喜欢的东西。

这肯定是我不喜欢的东西,但是对于带有 cgroup v2 的图像,我似乎会从以下开始:

-XX:MaxRAM=$(cat /sys/fs/cgroup/memory.max)

这样,运行:

java -XX:MaxRAMPercentage=50.0
     -XX:InitialRAMPercentage=50.0
     // we don't use this one, but just to look at he resident memory
     -XX:+AlwaysPreTouch
     -XX:MaxRAM=$(cat /sys/fs/cgroup/memory.max) 
     Dummy

会将 top -o %MEM 显示为 1GB。不理想,但有效。