RFR: 8349988: Change cgroup version detection logic to not depend on /proc/cgroups
Thomas Fitzsimmons
duke at openjdk.org
Thu Feb 27 15:21:26 UTC 2025
This pull request fixes https://bugs.openjdk.org/browse/JDK-8349988 and https://bugs.openjdk.org/browse/JDK-8347811.
I tested it with:
java -Xlog:os+container=trace -version
on:
`Red Hat Enterprise Linux 8 (cgroups v1 only)`:
_No change in behaviour_
`Fedora 41 (cgroups v2)`:
_More verbose output due to `/sys/fs/cgroup/cgroup.controllers` parsing:_
--- tt-old-f41.txt 2025-02-26 15:37:56.310738515 -0500
+++ tt-new-f41.txt 2025-02-26 15:37:56.601739407 -0500
@@ -1,7 +1,12 @@
[trace][os,container] OSContainer::init: Initializing Container Support
-[debug][os,container] Detected optional pids controller entry in /proc/cgroups
-[debug][os,container] controller cpuset is not enabled
- ]
+[debug][os,container] v2 controller cpuset is enabled and relevant
+[debug][os,container] v2 controller cpu is enabled and required
+[debug][os,container] v2 controller io is enabled but not relevant
+[debug][os,container] v2 controller memory is enabled and required
+[debug][os,container] v2 controller hugetlb is enabled but not relevant
+[debug][os,container] v2 controller pids is enabled and relevant
+[debug][os,container] v2 controller rdma is enabled but not relevant
+[debug][os,container] v2 controller misc is enabled but not relevant
[debug][os,container] Detected cgroups v2 unified hierarchy
[trace][os,container] Adjusting controller path for memory: /sys/fs/cgroup/user.slice/user-4215196.slice/user at 4215196.service/app.slice/app-org.gnome.Terminal.slice/vte-spawn-135086d6-2de4-4f2e-ad94-899b5eecaf83.scope
[trace][os,container] Path to /memory.max is /sys/fs/cgroup/user.slice/user-4215196.slice/user at 4215196.service/app.slice/app-org.gnome.Terminal.slice/vte-spawn-135086d6-2de4-4f2e-ad94-899b5eecaf83.scope/memory.max
`Fedora 41 (custom kernel with cgroups v1 disabled)`:
_Fixes `cgroups v2` detection:_
--- tt-old-f41-custom-kernel.txt 2025-02-26 15:37:58.197744304 -0500
+++ tt-new-f41-custom-kernel.txt 2025-02-26 15:37:59.380747933 -0500
@@ -1,7 +1,63 @@
[trace][os,container] OSContainer::init: Initializing Container Support
-[debug][os,container] Detected optional pids controller entry in /proc/cgroups
-[debug][os,container] controller cpuset is not enabled
- ]
-[debug][os,container] controller memory is not enabled
- ]
-[debug][os,container] One or more required controllers disabled at kernel level.
+[debug][os,container] v2 controller cpuset is enabled and relevant
+[debug][os,container] v2 controller cpu is enabled and required
+[debug][os,container] v2 controller io is enabled but not relevant
+[debug][os,container] v2 controller memory is enabled and required
+[debug][os,container] v2 controller hugetlb is enabled but not relevant
+[debug][os,container] v2 controller pids is enabled and relevant
+[debug][os,container] v2 controller rdma is enabled but not relevant
+[debug][os,container] v2 controller misc is enabled but not relevant
+[debug][os,container] Detected cgroups v2 unified hierarchy
+[trace][os,container] Adjusting controller path for memory: /sys/fs/cgroup/user.slice/user-1000.slice/session-95.scope
+[trace][os,container] Path to /memory.max is /sys/fs/cgroup/user.slice/user-1000.slice/session-95.scope/memory.max
+[trace][os,container] Memory Limit is: -1
+[trace][os,container] Memory Limit is: Unlimited
+[debug][os,container] container memory limit unlimited: -1, using host value 4094947328
+[trace][os,container] Path to /memory.max is /sys/fs/cgroup/user.slice/user-1000.slice/memory.max
+[trace][os,container] Memory Limit is: -1
+[trace][os,container] Memory Limit is: Unlimited
+[debug][os,container] container memory limit unlimited: -1, using host value 4094947328
+[trace][os,container] Path to /memory.max is /sys/fs/cgroup/user.slice/memory.max
+[trace][os,container] Memory Limit is: -1
+[trace][os,container] Memory Limit is: Unlimited
+[debug][os,container] container memory limit unlimited: -1, using host value 4094947328
+[trace][os,container] Path to /memory.max is /sys/fs/cgroup/memory.max
+[debug][os,container] Open of file /sys/fs/cgroup/memory.max failed, No such file or directory
+[trace][os,container] Memory Limit failed: -2
+[trace][os,container] Memory Limit is: -2
+[debug][os,container] container memory limit failed: -2, using host value 4094947328
+[trace][os,container] No lower limit found for memory in hierarchy /sys/fs/cgroup, adjusting to original path /user.slice/user-1000.slice/session-95.scope
+[trace][os,container] Adjusting controller path for cpu: /sys/fs/cgroup/user.slice/user-1000.slice/session-95.scope
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/user.slice/user-1000.slice/session-95.scope/cpu.max
+[trace][os,container] CPU Quota is: -1
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/user.slice/user-1000.slice/session-95.scope/cpu.max
+[trace][os,container] CPU Period is: 100000
+[trace][os,container] OSContainer::active_processor_count: 2
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/user.slice/user-1000.slice/cpu.max
+[trace][os,container] CPU Quota is: -1
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/user.slice/user-1000.slice/cpu.max
+[trace][os,container] CPU Period is: 100000
+[trace][os,container] OSContainer::active_processor_count: 2
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/user.slice/cpu.max
+[trace][os,container] CPU Quota is: -1
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/user.slice/cpu.max
+[trace][os,container] CPU Period is: 100000
+[trace][os,container] OSContainer::active_processor_count: 2
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max
+[debug][os,container] Open of file /sys/fs/cgroup/cpu.max failed, No such file or directory
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max
+[debug][os,container] Open of file /sys/fs/cgroup/cpu.max failed, No such file or directory
+[trace][os,container] CPU Period failed: -2
+[trace][os,container] OSContainer::active_processor_count: 2
+[trace][os,container] No lower limit found for cpu in hierarchy /sys/fs/cgroup, adjusting to original path /user.slice/user-1000.slice/session-95.scope
+[trace][os,container] total physical memory: 4094947328
+[trace][os,container] Path to /memory.max is /sys/fs/cgroup/user.slice/user-1000.slice/session-95.scope/memory.max
+[trace][os,container] Memory Limit is: -1
+[trace][os,container] Memory Limit is: Unlimited
+[debug][os,container] container memory limit unlimited: -1, using host value 4094947328
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/user.slice/user-1000.slice/session-95.scope/cpu.max
+[trace][os,container] CPU Quota is: -1
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/user.slice/user-1000.slice/session-95.scope/cpu.max
+[trace][os,container] CPU Period is: 100000
+[trace][os,container] OSContainer::active_processor_count: 2
+[debug][os,container] OSContainer::init: is_containerized() = false because no cpu or memory limit is present
`Alpine Linux v3.21 (unified, aka cgroups v2 only)`:
_Fixes `cgroups v2` detection:_
--- tt-old-alpine-unified.txt 2025-02-26 15:38:34.575898350 -0500
+++ tt-new-alpine-unified.txt 2025-02-26 15:38:36.156905658 -0500
@@ -1,7 +1,21 @@
[trace][os,container] OSContainer::init: Initializing Container Support
-[debug][os,container] Detected optional pids controller entry in /proc/cgroups
-[debug][os,container] controller cpuset is not enabled
- ]
-[debug][os,container] controller memory is not enabled
- ]
-[debug][os,container] One or more required controllers disabled at kernel level.
+[debug][os,container] v2 controller cpuset is enabled and relevant
+[debug][os,container] v2 controller cpu is enabled and required
+[debug][os,container] v2 controller io is enabled but not relevant
+[debug][os,container] v2 controller memory is enabled and required
+[debug][os,container] v2 controller hugetlb is enabled but not relevant
+[debug][os,container] v2 controller pids is enabled and relevant
+[debug][os,container] Detected cgroups v2 unified hierarchy
+[trace][os,container] total physical memory: 2074931200
+[trace][os,container] Path to /memory.max is /sys/fs/cgroup/memory.max
+[debug][os,container] Open of file /sys/fs/cgroup/memory.max failed, No such file or directory
+[trace][os,container] Memory Limit failed: -2
+[trace][os,container] Memory Limit is: -2
+[debug][os,container] container memory limit failed: -2, using host value 2074931200
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max
+[debug][os,container] Open of file /sys/fs/cgroup/cpu.max failed, No such file or directory
+[trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max
+[debug][os,container] Open of file /sys/fs/cgroup/cpu.max failed, No such file or directory
+[trace][os,container] CPU Period failed: -2
+[trace][os,container] OSContainer::active_processor_count: 2
+[debug][os,container] OSContainer::init: is_containerized() = false because no cpu or memory limit is present
`Alpine Linux v3.21 (hybrid)`:
_No change in behaviour._
`Alpine Linux v3.21 (legacy)`:
_No change in behaviour._
-------------
Commit messages:
- 8349988: Change cgroup version detection logic to not depend on /proc/cgroups
Changes: https://git.openjdk.org/jdk/pull/23811/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=23811&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8349988
Stats: 299 lines in 6 files changed: 212 ins; 23 del; 64 mod
Patch: https://git.openjdk.org/jdk/pull/23811.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/23811/head:pull/23811
PR: https://git.openjdk.org/jdk/pull/23811
More information about the hotspot-dev
mailing list