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

cgroup及cgroup2下CPU与内存使用率统计方案问询

资源监控与cgroup适配问题

我负责的系统需要定期监控以下资源使用情况:

  • CPU相对使用率(百分比)
  • 内存绝对使用量(GB)

现有Python实现方案:

  • 系统级统计:使用psutil库的psutil.cpu_percent()和psutil.virtual_memory()方法
  • cgroup v1统计:直接读取相关文件获取数据,包括:
    • CPU相关:cpu.cfs_period_us、cpu.cfs_quota_us、cpuacct.usage
    • 内存相关:memory.usage_in_bytes、memory.limit_in_bytes

问题1:直接读取文件的cgroup v1实现是否可行?

可行,但需要注意几个关键细节:

  • 权限问题:读取/sys/fs/cgroup下的文件需要对应权限,一般进程处于目标cgroup内或拥有系统权限即可读取
  • 数据计算逻辑:cpuacct.usage是累计CPU使用时间,需要两次采样计算时间差才能得到使用率
  • 异常处理:要处理文件不存在、读取失败的场景(比如cgroup未挂载、配置被修改)

问题2:若不可行,有无便捷工具可获取此类信息?

如果直接读文件的维护成本过高,可以用以下工具/库替代:

  • psutil:psutil已原生支持cgroup v1资源统计,无需手动读文件,调用psutil.Process().cgroup()结合相关方法即可获取CPU、内存数据
  • cgroup-tools:Linux官方工具集,cgget、cgsnapshot可直接查询cgroup资源数据,Python可通过子进程调用并解析输出
  • pycgroup:libcgroup的Python绑定,能更优雅地操作cgroup资源

问题3:若可行,如何适配cgroup2?

cgroup2采用统一单层级结构,不再按资源类型划分子目录,需调整读取路径和字段:

核心适配逻辑

  1. 判断cgroup版本:
    • 检查/sys/fs/cgroup/cgroup.controllers是否存在,存在则为cgroup2;否则通过是否存在多资源子目录(如cpu,cpuacct)判断为cgroup v1
  2. CPU统计适配:
    • 使用率计算:读取cpu.stat文件,其中usage_usec为累计CPU使用时间(微秒),需两次采样计算时间差;结合cpu.max文件的配额(格式为quota period,如100000 100000代表1核)计算相对使用率
    • 配额信息:cpu.max中值为max表示无限制
  3. 内存统计适配:
    • 使用量:读取memory.current文件(单位字节),转换为GB即可
    • 限制值:读取memory.max文件,值为max表示无限制
  4. 路径处理:
    • 进程所属cgroup路径可从/proc/self/cgroup获取,格式为0::/path/to/cgroup,提取路径后拼接至/sys/fs/cgroup即可

环境挂载信息

Ubuntu 20.04的cgroup挂载信息

$ cat /proc/mounts | grep cgroup
tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
cgroup2 /sys/fs/cgroup/unified cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,name=systemd 0 0
cgroup /sys/fs/cgroup/rdma cgroup rw,nosuid,nodev,noexec,relatime,rdma 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0

Ubuntu 22.04的cgroup2挂载信息

$ cat /proc/mounts | grep cgroup
cgroup2 /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec,relatime 0 0

内容的提问来源于stack exchange,提问作者Jakub Kuszneruk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:31:07