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