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
。不理想,但有效。
我们 运行 在切换我们的基础 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
。不理想,但有效。