You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:25:34