主机/sys/fs/cgroup/cpu路径无法显示Docker容器正确CPU配额值的原因排查
Docker容器CPU配额主机cgroup路径显示异常原因分析
核心原因:cgroups-v1下Docker的嵌套cgroup机制
在cgroups-v1环境中,Docker 24.0.9并未将CPU配额直接设置在你查看的/sys/fs/cgroup/cpu/<container-name>/cpu.cfs_quota_us路径对应的顶层cgroup节点上,而是通过嵌套cgroup实现配额控制:
- 容器内部看到的
/sys/fs/cgroup/cpu/实际映射到主机的子cgroup节点,而非你直接访问的顶层容器cgroup目录 - 主机上的
<container-name>目录是容器的顶层cgroup,但CPU配额被设置在该目录下的子cgroup中,容器进程实际挂载的是这个子cgroup,因此内部查看值正确,顶层目录显示-1(未设置)
验证方法
- 遍历容器顶层cgroup的子目录,查找正确的配额值:
sudo find /sys/fs/cgroup/cpu/<container-name> -name "cpu.cfs_quota_us" -exec cat {} \; - 通过容器内的cgroup映射确认主机路径:
输出类似docker exec <container-name> cat /proc/self/cgroup | grep cpu10:cpu:/<container-name>/<sub-path>,主机上对应路径的cpu.cfs_quota_us即为正确配额值
差异产生的背景
Docker在cgroups-v1中采用多层嵌套cgroup结构实现精细化资源隔离:
- 顶层cgroup仅用于容器标识和基础资源管控
- CPU、内存等具体配额会下沉到子cgroup设置,容器进程挂载该子cgroup,因此内部能获取正确配置
统计采集问题的解决方向
- 修改采集程序逻辑,不再直接访问顶层
<container-name>目录,而是根据容器/proc/self/cgroup的输出定位到对应子cgroup路径 - 改用Docker官方统计接口(如
docker stats命令或Docker API)获取配额信息,避免直接操作cgroup文件系统
内容的提问来源于stack exchange,提问作者Varun
相关产品推荐
相关产品推荐

