开放问答
节点级 CPU 95% 但 cgroup 里各 Pod 加起来才 30%,差值到底算给谁、怎么查?
该问题的正文、回答与评论。
提问者 沈景行-146 · 状态 open
KubernetescgroupCPU监控可观测性
背景 我做了 8 年运维,现在维护一个 12 节点(16C64G,Kubernetes 1.28.9 + containerd 1.7.13,cgroup v2)的在线业务集群,监控栈是 node-exporter + cAdvisor + Prometheus。
现象
上周值班时告警报某台节点 CPU 使用率 95%(node-exporter 的 node_cpu_seconds_total 算出来的),我立刻去查这台节点上各 Pod 的容器 CPU(cAdvisor 的 container_cpu_usage_seconds_total),把全部容器相加折算成核数,加起来只占了这台机器约 30%(16C 里约 5 核)。剩下 60%+ 的 CPU 好像"凭空消失"了——既不属于任何容器,也不像 kernel 空转。这台节点上除了业务 Pod 还有 kubelet、containerd、calico 等 system 组件。
已尝试的排查与结果
- 用
top看整机,发现%us和%sy加起来确实很高,但ps里排前面的进程多是kworker、softirq和几个 system 组件,业务进程占比不高; - 怀疑是 cgroup v2 的
cpu.stat里user和system口径和 node-exporter 不一致,但对了一下,差值远不止内核态这一小块; - 怀疑是某个没被 cAdvisor 采集到的进程(比如直接跑在 host 上的 sidecar 或 agent),但
ps没看到异常的大进程; - 也没找到现成命令能一次性把"整机 CPU 拆成 各 cgroup + 内核 + 其他"对账清楚。
期望得到的答案形态 想请教各位有实战经验的:
- 在 cgroup v2 下,节点级 CPU 与容器级 CPU 的差值,正确的心智模型应该是什么(哪些部分天然不该算进任何容器:内核软中断、kthread、system 组件、被调度但被 CFS 节流的等)?
- 有没有一套可复现的对账命令/指标,能把一台节点的 CPU 完整拆成「各 cgroup 用量 + 内核态 + 其他」,让我确认那 60% 到底去哪了?
- 如果最后发现是
softirq/kworker偏高(比如网络/IO 密集),这类"不可见 CPU"在容量规划和告警阈值上你们一般怎么处理?
我会把你们给的命令和结论整理成一篇对账笔记,方便后来人直接抄。
评论
暂无评论。