RFR: 8343191: Cgroup v1 subsystem fails to set subsystem path [v4]
Sergey Chernyshev
schernyshev at openjdk.org
Tue Nov 12 19:56:25 UTC 2024
> 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.
>
> 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
>
>
> Here, Java runs inside containerized process that is being moved cgroups due to load balancing.
>
> Let's examine the condition at line 64 here https://github.com/openjdk/jdk/blob/55a7cf14453b6cd1de91362927b2fa63cba400a1/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp#L59-L72
> It is always FALSE and the branch is never taken. The issue was spotted earlier by @jerboaa in [JDK-8288019](https://bugs.openjdk.org/browse/JDK-8288019).
>
> The original logic was intended to find the common prefix of `_root`and `cgroup_path` and concatenate the remaining suffix to the `_mount_point` (lines 67-68). That could lead to the following results:
>
> Example input
>
> _root = "/a"
> cgroup_path = "/a/b"
> _mount_point = "/sys/fs/cgroup/cpu,cpuacct"
>
>
> result _path
>
> "/sys/fs/cgroup/cpu,cpuacct/b"
>
>
> Here, cgroup_path comes from /proc/self/cgroup 3rd column. The man page (https://man7.org/linux/man-pages/man7/cgroups.7.html#NOTES) for control groups states:
>
>
> ...
> /proc/pid/cgroup (since Linux 2.6.24)
> This file describes control groups to which the process
> with the corresponding PID belongs. The displayed
> information differs for cgroups version 1 and version 2
> hierarchies.
> For each cgroup hierarchy of which the process is a
> member, there is one entry containing three colon-
> separated fields:
>
> hierarchy-ID:controller-list:cgroup-path
>
> For example:
>
> 5:cpuacct,cpu,cpuset:/daemons
> ...
> [3] This field contains the pathname of the control group
> in the hierarchy to which the process belongs. This
> pathname is relative to the mount point of the
> hierarchy.
>
>
> This explicitly states the "pathname is relative to the mount point of the hierarchy". Hence, the correct result could have been
>
>
> /sys/fs/cgroup/cpu,cpuacct/a/b
>
>
> Howe...
Sergey Chernyshev has updated the pull request incrementally with one additional commit since the last revision:
Update src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp
Co-authored-by: Severin Gehwolf <jerboaa at gmail.com>
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/21808/files
- new: https://git.openjdk.org/jdk/pull/21808/files/3bb779af..c808ad49
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=21808&range=03
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=21808&range=02-03
Stats: 1 line in 1 file changed: 0 ins; 0 del; 1 mod
Patch: https://git.openjdk.org/jdk/pull/21808.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/21808/head:pull/21808
PR: https://git.openjdk.org/jdk/pull/21808
More information about the core-libs-dev
mailing list