服务器突然变卡,第一件事不是重启,而是先看清楚是谁在占资源。这里整理我自己常用的顺序,每一步都写清楚「现在在看什么」。

第一步:确认整体负载

uptime

看三个 load average 值,分别是 1 分钟、5 分钟、15 分钟的平均负载。如果 1 分钟的值明显高于 CPU 核心数,说明刚刚有东西冲上来了。

第二步:用 top 按 CPU 排序

top -o %CPU

进入后按 1 可以展开每个核心的占用,按 H 可以把线程也显示出来。这一步能快速判断是单个进程吃满,还是很多进程一起分摊。

第三步:看具体进程在干什么

pidstat -p <PID> 1 5

拿上一步看到的 PID,连续采样 5 次,每次间隔 1 秒。相比 top 的瞬时值,这组数据更能看出趋势——是持续占用,还是周期性抖动。

第四步:确认线程级别

top -H -p <PID>

很多 Java 或 Go 服务整体看着只有 100%,但其实是某个线程在跑死循环。定位到线程 ID 后,再换算成十六进制去线程栈里找。

几个容易踩的坑

小结

排查的核心不是命令,而是分清「真的是算不过来」还是「在等别的东西」。这两个方向的下一步完全不同,先判断清楚再动手。