Linux CPU飙高排查实战:从top到perf的完整定位路径

举报
小原100 发表于 2026/10/24 11:43:53 2026/10/24
【摘要】 一次线上CPU飙高的排查思路整理:先分清load average与CPU使用率,再用top -H下钻到线程,用vmstat判断用户态还是内核态,最后用perf火焰图落到具体函数,附每一步的常用命令与参数。

一、先分清两个指标:load average 与 CPU 使用率

排查第一步不是急着敲 top,而是先弄清楚“飙高”到底是哪一个:load average 反映的是运行队列与不可中断(D 状态)任务的长度,CPU 使用率才是真正的计算开销。如果 1 分钟负载远高于核数而 CPU 使用率并不高,问题多半出在 IO 阻塞或大量 D 状态进程上,排查方向就完全不同了。

uptime
# load average: 24.10, 18.32, 9.05  → 8 核机器,负载 24 明显过载

二、定位到进程,再下钻到线程

top 里按大写 P 以 CPU 排序找到可疑进程后,记住两个常用参数:-H 直接显示线程,-p 只盯目标进程。Java 类应用尤其要下钻到线程,拿到线程 TID 后用 printf 转成十六进制,才能和 jstack 输出里的 nid 对上号。

top -Hp 12345
printf "%x\n" 23418   # 线程 TID 转十六进制
jstack 12345 | grep -A 20 nid=0x5b7a

三、看 us 与 sy 的比例,区分用户态和内核态

vmstat 1 的持续输出里,us 高说明业务代码本身在烧 CPU(算法复杂度、序列化、正则回溯);sy 高则多半是系统调用频繁、锁竞争或缺页中断;wa 高是 IO 等待;si/so 持续非零说明内存吃紧已经开始换页。mpstat -P ALL 1 可以逐核观察,判断是否被打满的只是个别核,这对定位绑核不当的进程特别有用。

vmstat 1
# r 列远大于核数 → 计算过载;b 列大 → IO 阻塞多
mpstat -P ALL 1

四、最后一公里:perf 采样与火焰图

确定了进程与方向仍找不到根因时,用 perf 对目标进程采样,火焰图里最宽的调用栈就是热点函数。没有图形环境时,perf top 也能直接看热点符号。

perf top -p 12345
perf record -F 99 -p 12345 -g -- sleep 30
perf script | stackcollapse-perf.pl | flamegraph.pl > hot.svg

五、小结

整条链路可以归纳为一句话:先用负载判断方向,再用 top -H 锁定线程,用 vmstat 区分用户态与内核态,最后用 perf 落到具体函数。绝大多数 CPU 飙高问题,都能在这四步之内收敛到根因。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。