Linux 服务器 CPU 占用高时的排查思路与实战命令
<h2>一、先确认“高”在哪个维度</h2>
<p>登录服务器后第一件事是看 top 的输出,重点不是看总的 CPU 利用率,而是拆开看几个指标:%us 是用户态占用,%sy 是内核态占用,%wa 是 IO 等待,%st 是被虚拟化层偷走的比例。如果 %wa 高,问题往往在磁盘 IO 而不是 CPU 计算;如果 %st 高,说明宿主机资源紧张,应用本身可能没问题。先把方向确定下来,后面的排查才不会南辕北辙。</p>
<h2>二、从进程到线程逐层定位</h2>
<p>top 找到占用最高的进程 PID 后,按 H 切换线程视图,或者直接用 top -H -p PID,观察具体是哪个线程在消耗 CPU。对 Java 服务,把线程号转成十六进制后到 jstack 输出里搜索,就能对应到具体堆栈;对 Go 服务,pprof 的 goroutine 视图会更直观。很多时候“CPU 高”最终都能落到某段具体代码上。</p>
<h2>三、常见原因与判断方法</h2>
<p>实践中见过的高 CPU 场景大致有几类:一是死循环或忙等待,特征是 CPU 曲线平滑地贴着 100%;二是频繁 GC,可以用 jstat -gcutil 观察 GC 次数和耗时;三是锁竞争后的自旋,需要结合火焰图看;四是大量小文件或网络系统调用,%sy 会明显偏高。不同原因对应的优化方向完全不同,先归因再动手。</p>
<h2>四、好用的工具组合</h2>
<p>pidstat -u 1 可以按进程持续采样,适合观察趋势;perf top 能直接看到热点函数,配合 perf record + perf report 生成火焰图数据;strace -c -p PID 统计系统调用耗时,但会对性能有明显影响,线上慎用。另外,vmstat 1 的 r 列如果长期大于核数,说明有大量任务在等待调度,也是 CPU 压力的信号。</p>
<h2>五、一个小结</h2>
<p>CPU 排查的核心思路是“先分维度、再分进程、最后分线程”的逐层收敛,工具只是手段。把这些命令整理成自己的排查清单,遇到告警时按步骤走一遍,比临时翻文档效率高得多。最后提醒一点:不要在生产环境长时间挂 perf 和 strace,采样类工具优先,抓取类工具要评估影响。</p>
- 点赞
- 收藏
- 关注作者
评论(0)