如何通过/sys/fs/cgroup读取当前进程的有效cgroups v1/v2 CPU限制
仅通过文件系统读取当前进程CPU cgroup限制的最简方案
针对你提出的四个核心疑问,结合cgroups v1/v2的内核行为,给出可兼容多环境的实操方案:
1. 如何定位cgroups根挂载目录?
必须通过/proc/self/mountinfo动态查找,不能依赖固定路径:
- 对于cgroups v2:过滤挂载类型为
cgroup2的条目,提取其挂载点作为根目录 - 对于cgroups v1:过滤挂载类型为
cgroup且包含cpu、cpuacct控制器的条目,对应的挂载点即为CPU子系统的根目录
操作示例:从
/proc/self/mountinfo的每行中,提取第5字段(挂载点)即可
2. 如何确定进程所在的子cgroup?
优先读取/proc/self/cgroup:
- 该文件每行格式为
控制器列表:层次ID:cgroup路径,对应v1的CPU控制器行或v2的统一控制行 - 若容器内该文件不存在(部分极简容器场景),回退到根cgroup是安全的——根cgroup默认无限制,读取根目录的限制文件会得到系统默认值(比如v2的
cpu.max默认值为max 100000)
3. 找不到限制文件时的处理逻辑?
是的,限制文件仅在设置过限制的cgroup层级存在,需从当前进程所在的最深层cgroup向上遍历:
- v2场景:先读取当前cgroup的
cpu.max,若文件不存在或内容为默认值,则向上查找父cgroup的cpu.max,直到根cgroup - v1场景:先读取当前cgroup的
cpu.cfs_quota_us和cpu.cfs_period_us,不存在则向上遍历父目录
4. cgroups v1与v2共存时的优先级?
优先使用cgroups v2:
- 内核中v2是统一控制的后续方案,若系统同时启用v2和v1,进程的CPU限制会优先遵循v2配置(除非进程明确绑定到v1的CPU子系统)
- 检测逻辑:先通过
/proc/self/mountinfo判断是否存在cgroup2挂载,若存在则优先处理v2,否则回退到v1
内容的提问来源于stack exchange,提问作者Ben Spiller
相关产品推荐
相关产品推荐

