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
- CPU相关:
问题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采用统一单层级结构,不再按资源类型划分子目录,需调整读取路径和字段:
核心适配逻辑
- 判断cgroup版本:
- 检查
/sys/fs/cgroup/cgroup.controllers是否存在,存在则为cgroup2;否则通过是否存在多资源子目录(如cpu,cpuacct)判断为cgroup v1
- 检查
- CPU统计适配:
- 使用率计算:读取
cpu.stat文件,其中usage_usec为累计CPU使用时间(微秒),需两次采样计算时间差;结合cpu.max文件的配额(格式为quota period,如100000 100000代表1核)计算相对使用率 - 配额信息:
cpu.max中值为max表示无限制
- 使用率计算:读取
- 内存统计适配:
- 使用量:读取
memory.current文件(单位字节),转换为GB即可 - 限制值:读取
memory.max文件,值为max表示无限制
- 使用量:读取
- 路径处理:
- 进程所属cgroup路径可从
/proc/self/cgroup获取,格式为0::/path/to/cgroup,提取路径后拼接至/sys/fs/cgroup即可
- 进程所属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
相关产品推荐
相关产品推荐

