CPU 高只是现象,先回答三个问题:是整机还是容器?是用户态还是内核态?是真忙还是被限流、等待?load average 包含不可中断睡眠(D 状态)进程,高 load 不等于 CPU 忙;容器里的 top 往往看到宿主机数据,必须结合 cgroup 的 cpu.stat。本页是分诊入口,单条命令的参数与原理见各命令页和 Linux 性能排查路线。
边界:不覆盖磁盘 IO、内存回收和 JVM GC 的完整调优;iowait 高时转到磁盘 IO 高,OOM 见 oom-killed。
nproc; uptime
top -b -n1 -H | head -30
pidstat -u -t 1 5
mpstat -P ALL 1 5
cat /proc/pressure/cpu
ps -eo pid,stat,pcpu,pmem,wchan:24,comm --sort=-pcpu | head
容器或 Kubernetes 里补查 cgroup 与集群视图:
cat /sys/fs/cgroup/cpu.stat
kubectl top pod -A --sort-by=cpu | head
kubectl top node
| 现象 | 优先检查 | 入口 |
|---|---|---|
| load 高但 CPU 不满 | D 状态、IO 等待、锁 | ps -eo stat,wchan、磁盘 IO 高 |
| 用户态高 | 热循环、GC、序列化、正则 | perf top、pidstat -u |
| 内核态高 | 系统调用、软中断、上下文切换 | mpstat、pidstat -w、sar -n DEV |
| iowait 高 | 磁盘、NFS、网络存储 | iostat -x 1、磁盘 IO 高 |
| steal 高 | 虚拟机邻居争抢 | 云监控、宿主机指标 |
| 容器 CPU 不高但变慢 | cgroup 限流 | cpu.stat 的 nr_throttled |
| 单核 100%、多核空闲 | 单线程瓶颈 | top -H、perf |
perf top 或语言级 profiler 定位热点函数,再决定优化代码还是加资源。pidstat -w 的自愿/非自愿切换,mpstat 的 %sys,以及 sar -n DEV 的包量。ps -eo stat,wchan 找到等待点,再用 iostat -x 看 %util、await。cpu.stat 的 nr_throttled、throttled_usec 持续增长就是证据;调整 limit 或优化突发。kubectl top、kubectl describe node 和 metrics-server 判断。%user/%sys/%iowait/%steal。wchan。load average 不是 CPU 使用率:D 状态进程也会推高 load。先看 ps -eo stat,不要直接加 CPU。top 常显示宿主机数据;确认容器 CPU 是否被限流,要看 cgroup 的 cpu.stat,不是宿主机 top。%CPU 可以超过 100%;top 默认按进程汇总,按 H 或 top -H 才能看到具体线程。perf record、连续 profiler 或更细粒度的指标。top 里看不出来:nr_throttled 增长、应用延迟抖动,往往比 CPU 使用率更能说明问题。%steal 高不是应用能解决的;先确认宿主机或云厂商侧的争抢。perf record -p <pid>、保存线程栈和日志,再决定处置。合上页面,先回答,再展开对照。
load average 很高但 CPU 使用率不高,可能是什么原因?先看哪个命令?top 看到的是宿主机 CPU,怎样确认容器是否被 cgroup 限流?ps -eo pid,stat,wchan,comm,再用 iostat -x 确认 IO。/sys/fs/cgroup/cpu.stat,重点看 nr_throttled 和 throttled_usec 是否持续增长,并结合 CPU limit 判断。perf top 或语言 profiler 找热点函数,pidstat -u 看进程;内核态高先用 mpstat、pidstat -w、sar -n DEV 看系统调用、上下文切换和网络软中断。
小程序版
微信扫码,随时查命令