一次 CPU 跑满的排查记录
从 top 到 perf,定位一个不干活的进程。
有天发现服务器负载一直很高,但业务没什么异常。这种"不干活的进程"最烦人,记录一下排查过程。
先看整体
top 确认是用户态还是内核态占用高,再看 ps aux --sort=-%cpu 找到占用的进程。我当时看到的进程 CPU 很高,但线程快照里显示在睡眠。
看线程而不是进程
top -H -p PID 能看到每个线程的状态和累计时间。如果某个线程累计时间一直在涨,但业务日志没有动静,基本可以判断是后台轮询或者忙等。
确认是不是 GPU 或设备在忙
有些程序会把计算压在设备侧,CPU 看起来空闲但设备满载。可以看设备侧的占用指标,比如 GPU 的 busy 百分比和频率,再对照功耗。功耗明显高于空闲值,说明设备真的在干活。
最后怎么处理
找到原因之后,要么改配置关掉常驻,要么改成按需启动。这次是某个服务空闲时仍然让设备满负荷轮询,停掉之后功耗立刻从 42W 降到 21W。
排查这类问题,别只看一个指标。CPU、内存、设备占用、功耗,交叉看才能定位。