top看 %us / %wa 分清类型,看排在最上面的是谁。
约 1258 字大约 4 分钟
2026-05-14
“CPU 100% 了”——但先别急着 kill。要先分清:是真有进程在猛算,还是 load 高但 CPU 其实在等 I/O?然后才是定位到具体进程、判断它是正常高峰还是 bug。这篇是照着走的清单,原理见 CPU 与 load average。
按“分清 CPU 型还是 I/O 型 → 定位进程 → 看是持续/周期/短暂 → 结合日志判断根因”的流程排查 CPU 飙高。
top看 %us / %wa 分清类型,看排在最上面的是谁。
uptime三个 load 值,结合核数判断负载、看趋势。
ps aux --sort=-%cpu | head按 CPU 占用排序,拿到具体 PID。
top -Hp PID进一步看是这个进程的哪个线程在吃 CPU。
收到“CPU 高”告警,第一件事不是找进程,是 top 看一眼类型:
| top 里看到 | 类型 | 往哪查 |
|---|---|---|
%us 高(用户态忙) | CPU 型,真有进程在算 | 继续往下,找进程 |
%wa 高(I/O wait 高) | I/O 型,CPU 在干等磁盘 | 转去 I/O 排查 |
%sy 高(内核态忙) | 系统调用 / 中断异常 | 看是不是频繁系统调用、网络中断 |
uptime 的 load 值也要结合核数看——8 核 load 6 和 2 核 load 6 完全不同。如果是 I/O 型,你再怎么在 CPU 上找进程都是错方向。
确认是 CPU 型(%us 高),找元凶:
top # 按 P 排序,看最上面是谁
ps aux --sort=-%cpu | head # 同样按 CPU 排序,记下 PID
top -Hp <PID> # 再下一层:这个进程的哪个线程在吃拿到 PID 和进程名,先别动。
同样是 CPU 高,处理方式完全不同:
uptime 的 1/5/15 分钟三个 load 值能帮你看趋势;多观察几次,而不是只截一个瞬间。
定位到进程、看清是哪种高,最后一步是理解它为什么在算:
journalctl -u <服务> -n 200 # 看这个服务在干什么是正常的流量高峰?是某个慢查询?是死循环 bug?是被攻击(大量异常请求)?日志和业务上下文才能回答“根因”,top 只能告诉你“现象”。
top 看 %us / %wa → 分清 CPU 型还是 I/O 型,I/O 型就转向。ps --sort=-%cpu 定位进程和 PID。journalctl -u 看日志 → 理解根因,再决定动不动手。别一看 CPU 高就 kill -9
直接杀掉占 CPU 最高的进程,两个风险:① 它可能就是核心业务进程,杀了是事故;② 如果根因是 I/O 或周期性任务,杀掉这个“CPU 大户”根本没解决问题,过会儿照旧。top、ps、uptime、journalctl 都是只读的,放心用来看清情况;kill 是有副作用的动作,要在“分清类型、定位进程、看懂日志”之后,且确认它不是关键业务时才做(见 信号与 kill)。
| 误区 | 更稳妥的做法 |
|---|---|
| CPU 告警就直接找进程 kill | 先 top 看 %us/%wa 分清 CPU 型还是 I/O 型 |
| 看 load 绝对值判断高不高 | 结合核数看,8 核 load 6 和 2 核 load 6 不同 |
| 截一个瞬间就下结论 | 多观察几次,区分持续高、周期高、短暂高 |
| 不看日志就判定是 bug | journalctl -u 结合业务,可能只是正常高峰 |
版权归属:Shuo Liu