首页/系统/Linux 内核与性能调优速查/CPU 使用率高排查流程
CPU 与调度60 条

CPU 使用率高排查流程

按层级排查:系统整体 → 具体进程 → 具体线程 → 函数级热点 → 归因(计算/系统调用/锁/GC),每步都有对应工具。

CPU 高怎么查

CPU 使用率高要按层级排查:先看系统整体消耗集中在哪些核,再看具体进程,然后下钻到线程,用采样工具定位函数级热点,最后归因到计算密集、系统调用、锁竞争或垃圾回收。对应工具有 mpstat(整体)、pidstat 与 top(进程)、top -H(线程)、perf(函数热点)、strace 与 pidstat -w(系统调用与切换)。容器与限核场景下,百分比要先按配额归一化再解读。

基本信息

整体视图mpstat -P ALL
进程视图pidstat -u 或 top
线程视图top -H、ps -eLo
热点分析perf top、perf record
容器换算百分比除以 cgroup 配额换算为核数

典型使用场景

  • 收到 CPU 高告警,需要快速定位到具体进程
  • 单核打满而整体不高,怀疑单线程热点
  • 限核容器里 CPU 百分比超过 100% 的正确解读
  • 压测中定位消耗 CPU 最多的函数
  • 判断高占用是计算密集还是锁与系统调用导致

分层排查命令

分层排查命令
mpstat -P ALL 1 3                       # 核间分布,先找热点核
pidstat -u 1 3 | sort -k8 -rn | head    # 按 CPU 占用排序的进程
top -H -b -n1 -p <pid> | head -20       # 下钻到进程内线程
top -H -b -n1 | sort -k9 -rn | head     # 全机线程视角
perf top -p <pid> --stdio | head -40    # 函数级热点
pidstat -w -p <pid> 1 3                 # 上下文切换,辅助判断锁竞争
cat /sys/fs/cgroup/<组>/cpu.max         # 容器限核时用于归一化
pidstat -t -p <pid> 1 3                 # 线程级 CPU 占用明细

分层工具对照

层次工具回答的问题
整体mpstat -P ALL消耗集中在哪些核
进程pidstat -u、top哪个进程占得多
线程top -H、ps -eLo进程内哪个线程占得多
函数perf top、perf record热点落在哪个函数
内核侧strace、pidstat -w、perf是计算、锁还是系统调用
限核容器中的 CPU 百分比可以超过 100%,解读时要除以配额换算成核数,否则会把正常的多核额度误判为异常。
先确认高占用是持续还是脉冲:单点采样容易抓错窗口,至少要连续采集几个周期再判断趋势。

归因方向对照

  • 用户态高而系统态低:多为应用计算密集,重点看算法与循环
  • 系统态偏高:怀疑系统调用、锁竞争或中断处理,结合 strace 与 perf 确认
  • 等待与切换偏高:可能是锁或内存分配阻塞,看 pidstat -w 与内存指标

易错点

  • 只看整体百分比:被单核热点或限核配额掩盖,定位不到真正瓶颈
  • 容器里不做归一化:超过 100% 的数值被误读,结论偏离事实
  • 单次采样就下结论:脉冲型热点需要多周期采样才能复现
  • 跳过线程层直接看函数热点:多线程服务的热点归属会被混淆
  • 忽略系统调用与锁:计算型与阻塞型的高占用处置方式完全不同

数据来源与参考

  • sysstat 文档
  • Linux 内核 perf 文档
  • procps-ng 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌