Docker stats部分容器CPU利用率显示0%,同节点其他容器正常求助
排查步骤
1. 验证CPU绑定配置有效性
先确认容器实际的CPU核心绑定是否与启动参数一致:
- 进入目标容器执行:
cat /proc/self/status | grep Cpus_allowed_list,检查输出是否匹配--cpuset-cpus指定的核心范围。 - 在宿主机上执行:
docker inspect <container-id> | grep -A5 CpusetCpus,对比配置值与期望值。
若配置不匹配,说明Docker在invoker0节点的cpuset分配逻辑存在异常。
2. 检查cgroup CPU统计数据
Docker stats依赖cgroup采集CPU使用数据,直接查看底层统计:
- 获取容器的cgroup路径:
docker inspect <container-id> | grep -i cgroup,得到类似/sys/fs/cgroup/cpu,cpuacct/docker/<container-id>的路径。 - 查看统计文件:
cat <cgroup-path>/cpuacct.stat,若user和system数值持续为0,说明cgroup未采集到容器的CPU使用数据,大概率是cgroup子系统挂载异常。 - 对比invoker1节点同类型容器的该文件数值,确认是否有正常增长。
3. 排查宿主机cgroup挂载状态
确认invoker0节点的cgroup子系统挂载是否正常:
- 执行:
mount | grep cgroup,检查cpu、cpuacct子系统是否正常挂载到/sys/fs/cgroup/cpu,cpuacct。 - 查看系统级cgroup统计:
cat /sys/fs/cgroup/cpu/cpu.stat,确认基础统计功能正常。
若挂载异常,可尝试重新挂载:mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct(操作前需备份现有配置,避免影响其他运行中容器)。
4. 对比节点的Docker与内核版本
检查invoker0和invoker1的版本差异:
- 执行:
docker version和uname -r,对比两者的Docker版本、内核版本。部分Docker版本与特定Linux内核组合存在cpuset统计bug,比如早期版本绑定核心后统计失效的问题。
若版本不一致,可将invoker0的Docker版本升级至与invoker1一致,或查阅对应版本的Release Notes确认是否有相关修复。
5. 检查宿主机CPU核心状态
确认invoker0上指定的CPU核心是否在线可用:
- 执行:
cat /sys/devices/system/cpu/cpu<core-id>/online(替换<core-id>为绑定的核心编号),输出应为1(表示核心在线)。 - 执行
htop或top,观察指定核心是否有实际负载。若核心无任何负载,可能是容器进程未被调度到目标核心上。
6. 检查Openwhisk Invoker进程权限
确认invoker0上的Openwhisk invoker进程是否具备修改cpuset的权限:
- 执行:
ps aux | grep invoker,查看进程是否拥有CAP_SYS_NICE或CAP_SYS_ADMIN权限。 - 对比invoker1节点的invoker进程权限配置,排查权限差异导致的问题。
内容的提问来源于stack exchange,提问作者kz28
相关产品推荐
相关产品推荐

