CPU使用率高排查思路

一、先确认:是不是真的 CPU 高?

执行:

bash

top

看这两行:

  • %Cpu(s)us、sy、id、wa
    • us:用户进程占比(应用、Java、PHP、Python…)
    • sy:系统内核占比
    • id:空闲(idle)
    • wa:磁盘 IO 等待(不是 CPU)

判断口诀

  • id 很低(比如 < 30%)→ 真・CPU 高
  • wa 很高(>20%)→ 不是 CPU 忙,是磁盘慢
  • us 高 → 业务程序问题
  • sy 高 → 系统调用 / 内核 / 驱动问题

二、第一步:找到最耗 CPU 的进程

top 里直接按:

P  # 按CPU使用率排序

你会看到:

  • PID
  • %CPU
  • COMMAND(进程名)

记下这两个:

  • 耗 CPU 最高的 PID
  • 进程名(java、nginx、node、python、mysqld…)

三、第二步:看这个进程里,哪个线程在狂吃 CPU

bash

# 显示该进程的所有线程
top -H -p <PID>

拿到 狂耗 CPU 的线程 TID

四、第三步:把线程 TID 转成 16 进制(用于查堆栈)

bash

printf "%x\n" <TID>

得到一个 16 进制编号,后面用。

五、第四步:抓进程堆栈,定位代码行

Java 最常用:

bash

jstack <PID> > stack.log

打开 stack.log,搜索刚才的 16 进制 TID,就能看到:

  • 类名
  • 方法名
  • 代码行号

C/C++/Go/PHP/Python:

bash

strace -p <PID>

看它在疯狂做什么系统调用。


六、第五步:常见 CPU 高的真凶(你直接对照)

1. 死循环(最常见)

  • CPU 100%
  • 不读写磁盘
  • 业务没反应

2. 频繁 GC(Java)

  • Java 进程 CPU 爆高
  • 内存忽高忽低
  • jstack 大量 GC 线程

3. 大量计算 / 加密 / 压缩

ffmpeg、zip、gzip、加密算法。

4. 死锁 / 自旋锁

sy 很高,us 一般。

5. 爬虫 / 扫描 / 被攻击

nginx、httpd、业务端口流量暴增 → CPU 拉高。

七、最简单的万能排查命令(直接背)

bash

# 1. 看整体
top

# 2. 按CPU排序
P

# 3. 看进程内线程
top -H -p PID

# 4. Java抓栈
jstack PID > j.log

# 5. 搜索线程16进制
grep 16进制TID j.log

八、你可以直接用的判断总结

  1. us 高 → 业务代码问题(死循环、计算多、GC)
  2. sy 高 → 系统 / 内核 / 锁竞争 / 线程太多
  3. wa 高 → 磁盘慢,不是 CPU
  4. id 低 → 真的跑满了
  5. Java → 90% 是死循环或 GC
  6. 脚本语言 → 循环 / 正则 / IO 阻塞
滚动至顶部