直接看top按p排序可快速定位高cpu进程,重点关注%cpu(s)中us/sy/wa占比及进程pid;再用top-h-p[pid]或pidstat-t-p[pid]查线程tid,并转十六进制后结合jstack或perf top定位具体函数。

直接看 top,按 P 排序,一眼就能揪出 CPU 占用最高的进程。这是排查的第一步,也是最关键的一步。
快速定位高 CPU 进程
执行 top 命令后,重点关注两处:
- 顶部的 %Cpu(s) 行:看 us(用户态)、sy(内核态)、wa(I/O 等待)占比。us 高说明是程序在猛算;sy 高可能是系统调用或中断异常;wa 高则 CPU 其实没真干活,瓶颈在磁盘或网络
- 进程列表:按 Shift + P 按 CPU 使用率降序排列,第一行就是当前最“吃”CPU 的进程,记下它的 PID
补充替代方案:
- ps aux --sort=-%cpu | head -10:一次性输出 CPU 占比前 10 的进程,适合脚本或快速快照
- pidstat -u 1:每秒刷新一次各进程 CPU 使用率,带 %usr(用户态)和 %sys(内核态)细分,比 top 更干净
深入到线程级别
一个进程可能有几十个线程,真正作祟的往往只是其中一两个。确认高 CPU 进程 PID 后,继续深挖:
- top -H -p [PID]:只显示该进程下的所有线程,再按 P 排序,找到 TID(线程 ID)最高的那个
- pidstat -t -p [PID] 1:更清晰地列出每个线程的 CPU 占用,避免 top 界面干扰
注意:Linux 内核和调试工具(如 jstack、perf)识别线程用的是十六进制 TID,所以拿到十进制 TID 后要转换:
- printf "%x\n" [TID]:比如 TID 是 12345,输出就是 3039
定位具体代码或函数
知道哪个线程在狂转,下一步就是搞清它在跑什么:
- 如果是 Java 应用:jstack [PID] | grep -A 20 [16进制TID],查看该线程的堆栈,重点看栈顶方法(比如在死循环、正则匹配或 GC 中)
- 通用方法:perf top -p [PID](需 root),实时显示进程内耗 CPU 最多的函数名,直接定位热点代码
- 快速看调用栈:pstack [PID],输出所有线程当前执行位置,人工筛选高 CPU 线程那一段
如果怀疑是恶意进程,顺手查一下:ls -l /proc/[PID]/exe 看真实路径,netstat -tulnp | grep [PID] 看有没有异常连接。
区分真假高负载
CPU 利用率 100% 不等于系统真卡。关键看上下文:
- uptime 或 top 顶部的 load average:如果 1 分钟值远超逻辑 CPU 核心数(可执行 nproc 查),说明任务排队严重
- iostat -x 1:若 %util 接近 100 且 await 很高,说明 CPU 高是因为在等磁盘,不是计算瓶颈
- vmstat 1:看 cs(上下文切换)是否异常高,过高可能意味着大量线程争抢 CPU 或频繁系统调用
不复杂但容易忽略。











