JDK-8343191 : Cgroup v1 subsystem fails to set subsystem path
  • Type: Bug
  • Component: hotspot
  • Sub-Component: runtime
  • Affected Version: 17.0.13,21.0.5,23.0.1,24
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: linux
  • CPU: generic
  • Submitted: 2024-10-29
  • Updated: 2025-04-22
  • Resolved: 2025-03-05
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 24 JDK 25
24.0.2Fixed 25 b13Fixed
Related Reports
Causes :  
Duplicate :  
Duplicate :  
Relates :  
Relates :  
Relates :  
Description
The following issue was found in Linux cgroup subsystem implementation. The Cgroup V1 subsustem fails to initialize mounted controllers properly in certain cases, that may lead to controllers left undetected/inactive. We observed the behavior in CloudFoundry deployments, it affects also host systems.

In cases where the JVM isn't PID 1, for example started from a shell - and the shell process has been moved from one cgroup path to another - then the JVM might set the subsystem path to null (on cg v1).

[0.001s][trace][os,container] OSContainer::init: Initializing Container Support
[0.001s][debug][os,container] Detected optional pids controller entry in /proc/cgroups
[0.002s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers
[0.002s][trace][os,container] Adjusting controller path for memory: (null)
[0.002s][debug][os,container] read_string: subsystem path is null
[0.002s][trace][os,container] Memory Limit failed: -2
[0.002s][debug][os,container] read_string: subsystem path is null
[0.002s][trace][os,container] Memory Limit failed: -2
[0.002s][trace][os,container] No lower limit found for memory in hierarchy /sys/fs/cgroup/memory, adjusting to original path /test
[0.002s][debug][os,container] OSContainer::init: is_containerized() = true because all controllers are mounted read-only (container case)
[0.003s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us
[0.003s][trace][os,container] CPU Quota is: -1
[0.003s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us
[0.003s][trace][os,container] CPU Period is: 100000
[0.003s][trace][os,container] OSContainer::active_processor_count: 12
[0.003s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
[0.003s][trace][os,container] total physical memory: 67163226112
[0.003s][debug][os,container] read_string: subsystem path is null
[0.003s][trace][os,container] Memory Limit failed: -2
[0.005s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
[0.021s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
openjdk 24-internal 2025-03-18
OpenJDK Runtime Environment (build 24-internal-adhoc.sgehwolf.jdk-jdk)
OpenJDK 64-Bit Server VM (build 24-internal-adhoc.sgehwolf.jdk-jdk, mixed mode, sharing)

On the Java Metrics side this would be observable by a NPE for example when the application code uses some MXBean code.

This test code:

public class Test {
    public static void main(String[] args) {
        java.lang.management.ManagementFactory.getPlatformMBeanServer();
        System.out.println("PASSED.");
    }
}

would result in the following NPE on affected systems:

Exception in thread "main" java.lang.NullPointerException
	at java.base/java.util.Objects.requireNonNull(Objects.java:220)
	at java.base/sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:296)
	at java.base/java.nio.file.Path.of(Path.java:148)
	at java.base/java.nio.file.Paths.get(Paths.java:69)
	at java.base/jdk.internal.platform.CgroupUtil.lambda$readStringValue$0(CgroupUtil.java:67)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
	at java.base/jdk.internal.platform.CgroupUtil.readStringValue(CgroupUtil.java:69)
	at java.base/jdk.internal.platform.CgroupSubsystemController.getStringValue(CgroupSubsystemController.java:65)
	at java.base/jdk.internal.platform.CgroupSubsystemController.getLongValue(CgroupSubsystemController.java:124)
	at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getLongValue(CgroupV1Subsystem.java:190)
	at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getHierarchical(CgroupV1Subsystem.java:160)
	at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.initSubSystem(CgroupV1Subsystem.java:85)
	at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getInstance(CgroupV1Subsystem.java:61)
	at java.base/jdk.internal.platform.CgroupSubsystemFactory.create(CgroupSubsystemFactory.java:119)
	at java.base/jdk.internal.platform.CgroupSubsystemFactory.create(CgroupSubsystemFactory.java:89)
	at java.base/jdk.internal.platform.CgroupMetrics.getInstance(CgroupMetrics.java:198)
	at java.base/jdk.internal.platform.SystemMetrics.instance(SystemMetrics.java:29)
	at java.base/jdk.internal.platform.Metrics.systemMetrics(Metrics.java:58)
	at java.base/jdk.internal.platform.Container.metrics(Container.java:43)
	at jdk.management/com.sun.management.internal.OperatingSystemImpl.<init>(OperatingSystemImpl.java:175)
	at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl.getOperatingSystemMXBean(PlatformMBeanProviderImpl.java:316)
	at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl$4.nameToMBeanMap(PlatformMBeanProviderImpl.java:235)
	at java.management/java.lang.management.ManagementFactory.lambda$getPlatformMBeanServer$0(ManagementFactory.java:489)
	at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:289)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1788)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:153)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:176)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636)
	at java.management/java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:490)
	at Test.main(Test.java:3)


The relevant /proc/self/mountinfo line is

---
2207 2196 0:43 /system.slice/garden.service/garden/good/2f57368b-0eda-4e52-64d8-af5c /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime master:25 - cgroup cgroup rw,cpu,cpuacct
---

/proc/self/cgroup:

---
11:cpu,cpuacct:/system.slice/garden.service/garden/bad/2f57368b-0eda-4e52-64d8-af5c
---

Note that by default, on cg v1 systems containers run with cgroupns=host while on cg v2 systems containers run with cgroupns=private by default. The issue has been observed on the default configs in unprivileged containers where the JVM runs.

Steps to reproduce on a cgroup v1 system are (using --cgroupns=host for clarity):

$ sudo podman run -ti --cgroupns=host --rm --volume=$(pwd)/build/linux-x86_64-server-release/images/jdk:/jdk:z --memory 400m fedora:39 bash -c 'bash'
[root@5aee0ffdd70b /]# /jdk/bin/java -Xlog:os+container=trace --version
[0.000s][trace][os,container] OSContainer::init: Initializing Container Support
[0.000s][debug][os,container] Detected optional pids controller entry in /proc/cgroups
[0.001s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers
[0.001s][debug][os,container] OSContainer::init: is_containerized() = true because all controllers are mounted read-only (container case)
[0.001s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us
[0.001s][trace][os,container] CPU Quota is: -1
[0.001s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us
[0.001s][trace][os,container] CPU Period is: 100000
[0.001s][trace][os,container] OSContainer::active_processor_count: 12
[0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
[0.001s][trace][os,container] total physical memory: 67163238400
[0.001s][trace][os,container] Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes
[0.001s][trace][os,container] Memory Limit is: 419430400
[0.002s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
[0.014s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
openjdk 24-internal 2025-03-18
OpenJDK Runtime Environment (build 24-internal-adhoc.sgehwolf.jdk-jdk)
OpenJDK 64-Bit Server VM (build 24-internal-adhoc.sgehwolf.jdk-jdk, mixed mode, sharing)

In a separate terminal, find the PID of the shell in the container (10391 in this case) and move it to a different path, /sys/fs/cgroup/memory/test, for example like so:

$ sudo mkdir /sys/fs/cgroup/memory/test
# echo 10391 > /sys/fs/cgroup/memory/test/cgroup.procs

In the shell where the container runs try to run 'java --version' again and observe the null subsystem paths:

[root@5aee0ffdd70b /]# /jdk/bin/java -Xlog:os+container=trace --version
[0.000s][trace][os,container] OSContainer::init: Initializing Container Support
[0.000s][debug][os,container] Detected optional pids controller entry in /proc/cgroups
[0.001s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers
[0.001s][trace][os,container] Adjusting controller path for memory: (null)
[0.001s][debug][os,container] read_string: subsystem path is null
[0.001s][trace][os,container] Memory Limit failed: -2
[0.001s][debug][os,container] read_string: subsystem path is null
[0.001s][trace][os,container] Memory Limit failed: -2
[0.001s][trace][os,container] No lower limit found for memory in hierarchy /sys/fs/cgroup/memory, adjusting to original path /test
[0.001s][debug][os,container] OSContainer::init: is_containerized() = true because all controllers are mounted read-only (container case)
[0.001s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us
[0.001s][trace][os,container] CPU Quota is: -1
[0.001s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us
[0.001s][trace][os,container] CPU Period is: 100000
[0.001s][trace][os,container] OSContainer::active_processor_count: 12
[0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
[0.001s][trace][os,container] total physical memory: 67163238400
[0.001s][debug][os,container] read_string: subsystem path is null
[0.001s][trace][os,container] Memory Limit failed: -2
[0.003s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
[0.020s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 12
openjdk 24-internal 2025-03-18
OpenJDK Runtime Environment (build 24-internal-adhoc.sgehwolf.jdk-jdk)
OpenJDK 64-Bit Server VM (build 24-internal-adhoc.sgehwolf.jdk-jdk, mixed mode, sharing)

[root@5aee0ffdd70b /]# grep memory /proc/self/mountinfo 
1476 1473 0:43 /machine.slice/libpod-5aee0ffdd70b215ba4115f31e5438fa4708be8fd3a11ad75cbc93b0869788dfd.scope/container /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,seclabel,memory
[root@5aee0ffdd70b /]# grep memory /proc/self/cgroup 
11:memory:/test

For the NPE issue, reproducer steps are similar.
Comments
[jdk24u-fix-request] Approval Request from Sergey Chernyshev The fix improves container detection, applies cleanly to jdk24u. There's no compatibility impact.
06-03-2025

A pull request was submitted for review. Branch: master URL: https://git.openjdk.org/jdk24u/pull/113 Date: 2025-03-05 23:24:19 +0000
05-03-2025

Changeset: de29ef3b Branch: master Author: Sergey Chernyshev <schernyshev@openjdk.org> Committer: Dmitry Chuyko <dchuyko@openjdk.org> Date: 2025-03-05 10:32:36 +0000 URL: https://git.openjdk.org/jdk/commit/de29ef3bf3a029f99f340de9f093cd20544217fd
05-03-2025

JDK-8286212 seems related, but we didn't have a way to reproduce at the time.
13-11-2024

Example for NPE: public class Test { public static void main(String[] args) { java.lang.management.ManagementFactory.getPlatformMBeanServer(); System.out.println("PASSED."); } } Script (cg v1): sudo docker run --tty=true --rm --volume=$JAVA_HOME:/jdk --volume=./classes:/classes:ro --memory 400m ubuntu:latest \ sh -c "sleep 10 ; /jdk/bin/java -cp .:/classes Test" & sleep 10; HOSTPID=$(sudo ps -ef | awk '/jdk\/bin\/java/ && !/docker/ && !/awk/ { print $2 }') echo $HOSTPID | sudo tee /sys/fs/cgroup/memory/test/cgroup.procs > /dev/null sleep 10 Result (cg v1 before patch): Exception in thread "main" java.lang.NullPointerException at java.base/java.util.Objects.requireNonNull(Objects.java:220) at java.base/sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:296) at java.base/java.nio.file.Path.of(Path.java:148) at java.base/java.nio.file.Paths.get(Paths.java:69) at java.base/jdk.internal.platform.CgroupUtil.lambda$readStringValue$0(CgroupUtil.java:67) at java.base/java.security.AccessController.doPrivileged(AccessController.java:571) at java.base/jdk.internal.platform.CgroupUtil.readStringValue(CgroupUtil.java:69) at java.base/jdk.internal.platform.CgroupSubsystemController.getStringValue(CgroupSubsystemController.java:65) at java.base/jdk.internal.platform.CgroupSubsystemController.getLongValue(CgroupSubsystemController.java:124) at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getLongValue(CgroupV1Subsystem.java:190) at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getHierarchical(CgroupV1Subsystem.java:160) at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.initSubSystem(CgroupV1Subsystem.java:85) at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getInstance(CgroupV1Subsystem.java:61) at java.base/jdk.internal.platform.CgroupSubsystemFactory.create(CgroupSubsystemFactory.java:119) at java.base/jdk.internal.platform.CgroupSubsystemFactory.create(CgroupSubsystemFactory.java:89) at java.base/jdk.internal.platform.CgroupMetrics.getInstance(CgroupMetrics.java:198) at java.base/jdk.internal.platform.SystemMetrics.instance(SystemMetrics.java:29) at java.base/jdk.internal.platform.Metrics.systemMetrics(Metrics.java:58) at java.base/jdk.internal.platform.Container.metrics(Container.java:43) at jdk.management/com.sun.management.internal.OperatingSystemImpl.<init>(OperatingSystemImpl.java:175) at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl.getOperatingSystemMXBean(PlatformMBeanProviderImpl.java:316) at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl$4.nameToMBeanMap(PlatformMBeanProviderImpl.java:235) at java.management/java.lang.management.ManagementFactory.lambda$getPlatformMBeanServer$0(ManagementFactory.java:489) at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:289) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197) at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1788) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:153) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:176) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636) at java.management/java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:490) at Test.main(Test.java:3) After patch: [0.001s][warning][os,container] Cgroup v1 controller (/sys/fs/cgroup/memory) mounting root [/docker/e7ecd9685bcbbd3e7d3e81ad7c23cadf5d96db85c324f66d290f0d289ad867dd] doesn't match cgroup [/test] [0.001s][warning][os,container] Cgroup v1 controller (/sys/fs/cgroup/memory) mounting root [/docker/e7ecd9685bcbbd3e7d3e81ad7c23cadf5d96db85c324f66d290f0d289ad867dd] doesn't match cgroup [/] [0.001s][warning][os,container] Cgroup v1 controller (/sys/fs/cgroup/memory) mounting root [/docker/e7ecd9685bcbbd3e7d3e81ad7c23cadf5d96db85c324f66d290f0d289ad867dd] doesn't match cgroup [/] Nov 12, 2024 1:14:11 PM jdk.internal.platform.cgroupv1.CgroupV1SubsystemController setPath WARNING: Cgroup v1 controller (/sys/fs/cgroup/memory) mounting root [/docker/e7ecd9685bcbbd3e7d3e81ad7c23cadf5d96db85c324f66d290f0d289ad867dd] doesn't match cgroup [/test]. PASSED. In cg v2 the NPE is not observed.
12-11-2024

Adding related JDK-8288019, which this issue proves is dead code.
11-11-2024

The key to reproduce is that a parent process, the shell, moves from one cgroup hierarchy to another and that process subsequently (post move) launches java.
11-11-2024

This looks to affect cgroups v2 as well. Using a similar test-script than what Sergey pasted above I get this with podman and rootless containers on cg v2: [0.008s][trace][os,container] OSContainer::init: Initializing Container Support [0.008s][debug][os,container] Detected optional pids controller entry in /proc/cgroups [0.008s][debug][os,container] Detected cgroups v2 unified hierarchy [0.008s][trace][os,container] Adjusting controller path for memory: /sys/fs/cgroup/../../../../../../test [0.008s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../../../../../../test/memory.max [0.008s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/memory.max failed, No such file or directory [0.008s][trace][os,container] Memory Limit failed: -2 [0.008s][trace][os,container] Memory Limit is: -2 [0.008s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.008s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../../../../../../memory.max [0.008s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../memory.max failed, No such file or directory [0.008s][trace][os,container] Memory Limit failed: -2 [0.009s][trace][os,container] Memory Limit is: -2 [0.009s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.009s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../../../../../memory.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../memory.max failed, No such file or directory [0.009s][trace][os,container] Memory Limit failed: -2 [0.009s][trace][os,container] Memory Limit is: -2 [0.009s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.009s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../../../../memory.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../memory.max failed, No such file or directory [0.009s][trace][os,container] Memory Limit failed: -2 [0.009s][trace][os,container] Memory Limit is: -2 [0.009s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.009s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../../../memory.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../memory.max failed, No such file or directory [0.009s][trace][os,container] Memory Limit failed: -2 [0.009s][trace][os,container] Memory Limit is: -2 [0.009s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.009s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../../memory.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../memory.max failed, No such file or directory [0.009s][trace][os,container] Memory Limit failed: -2 [0.009s][trace][os,container] Memory Limit is: -2 [0.009s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.009s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../memory.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../memory.max failed, No such file or directory [0.009s][trace][os,container] Memory Limit failed: -2 [0.009s][trace][os,container] Memory Limit is: -2 [0.009s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.009s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/memory.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/memory.max failed, No such file or directory [0.009s][trace][os,container] Memory Limit failed: -2 [0.009s][trace][os,container] Memory Limit is: -2 [0.009s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.009s][trace][os,container] No lower limit found for memory in hierarchy /sys/fs/cgroup, adjusting to original path /../../../../../../test [0.009s][trace][os,container] Adjusting controller path for cpu: /sys/fs/cgroup/../../../../../../test [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../../test/cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../../test/cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] No lower limit found for cpu in hierarchy /sys/fs/cgroup, adjusting to original path /../../../../../../test [0.009s][debug][os,container] OSContainer::init: is_containerized() = true because all controllers are mounted read-only (container case) [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../../test/cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/cpu.max failed, No such file or directory [0.009s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../../test/cpu.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/cpu.max failed, No such file or directory [0.009s][trace][os,container] CPU Period failed: -2 [0.009s][trace][os,container] OSContainer::active_processor_count: 6 [0.009s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 6 [0.009s][trace][os,container] total physical memory: 6204755968 [0.009s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../../../../../../test/memory.max [0.009s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/memory.max failed, No such file or directory [0.009s][trace][os,container] Memory Limit failed: -2 [0.009s][trace][os,container] Memory Limit is: -2 [0.009s][debug][os,container] container memory limit failed: -2, using host value 6204755968 [0.011s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 6 [0.104s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../../test/cpu.max [0.105s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/cpu.max failed, No such file or directory [0.105s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/../../../../../../test/cpu.max [0.105s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/cpu.max failed, No such file or directory [0.105s][trace][os,container] CPU Period failed: -2 [0.105s][trace][os,container] OSContainer::active_processor_count: 6 [0.112s][trace][os,container] total physical memory: 6204755968 [0.112s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/../../../../../../test/memory.max [0.112s][debug][os,container] Open of file /sys/fs/cgroup/../../../../../../test/memory.max failed, No such file or directory [0.112s][trace][os,container] Memory Limit failed: -2 [0.112s][trace][os,container] Memory Limit is: -2 [0.112s][debug][os,container] container memory limit failed: -2, using host value 6204755968 openjdk version "24-internal" 2025-03-18 OpenJDK Runtime Environment (fastdebug build 24-internal-adhoc.sgehwolf.jdk-jdk) OpenJDK 64-Bit Server VM (fastdebug build 24-internal-adhoc.sgehwolf.jdk-jdk, mixed mode, sharing)
11-11-2024

This particular issue seems to surface on the cloudfoundry stack. Posting some documentation: Diego (archived design notes): https://github.com/cloudfoundry/diego-design-notes
11-11-2024

To reproduce the issue: 1. Create a new cgroup for memory $ sudo mkdir -p /sys/fs/cgroup/memory/test 2. Run the following script --- docker run --tty=true --rm --volume=$JAVA_HOME:/jdk --memory 400m ubuntu:latest \ sh -c "sleep 10 ; /jdk/bin/java -Xlog:os+container=trace -version" | grep Memory\ Limit & sleep 10 HOSTPID=$(sudo ps -ef | awk '/container=trace/ && !/docker/ && !/awk/ { print $2 }') echo $HOSTPID | sudo tee /sys/fs/cgroup/memory/test/cgroup.procs sleep 10 --- Example output --- 9804 [0.001s][trace][os,container] Memory Limit failed: -2 [0.001s][trace][os,container] Memory Limit failed: -2 [0.002s][trace][os,container] Memory Limit failed: -2 [0.043s][trace][os,container] Memory Limit failed: -2 ---
07-11-2024

ILW = MMH => P3
07-11-2024

A pull request was submitted for review. Branch: master URL: https://git.openjdk.org/jdk/pull/21808 Date: 2024-10-31 15:00:25 +0000
31-10-2024

diego/guardian moves the containerized process between cgroups in question on load balancing / throtling CPU. The solution is to ignore _root/cgroup_path in containers.
31-10-2024

I don't have time to investigate this more, but JDK-8288019 looks related. We don't know what the original code is supposed to handle. Do you have a way to reproduce this? What's the setup needed to replicate it?
29-10-2024