一、先确认:是不是真的 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
八、你可以直接用的判断总结
- us 高 → 业务代码问题(死循环、计算多、GC)
- sy 高 → 系统 / 内核 / 锁竞争 / 线程太多
- wa 高 → 磁盘慢,不是 CPU
- id 低 → 真的跑满了
- Java → 90% 是死循环或 GC
- 脚本语言 → 循环 / 正则 / IO 阻塞