服务器突然变卡,第一件事不是重启,而是先看清楚是谁在占资源。这里整理我自己常用的顺序,每一步都写清楚「现在在看什么」。
第一步:确认整体负载
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 后,再换算成十六进制去线程栈里找。
几个容易踩的坑
- load 高但 CPU 不高:多半是磁盘 I/O 或大量进程在等锁,去看
iostat -x 1。 - %wa 很高:等待 I/O 的时间,不是 CPU 算不过来。
- top 里看不到异常:可能进程在一秒内起落,用
pidstat 1连续观察更靠谱。
小结
排查的核心不是命令,而是分清「真的是算不过来」还是「在等别的东西」。这两个方向的下一步完全不同,先判断清楚再动手。