Yihui’s Blog

线上 CPU Load 飙高如何排查?

日期:2026-07-11
标签:#面试 #八股 #后端 #线上问题排查 #场景题

一句话答案

Load 表示可运行任务与不可中断睡眠任务的平均数量,排查时应先比较 CPU 核数,再区分 CPU 争用和 I/O 阻塞,而不能看到 Load 高就认定 CPU 算力不足。

面试口语版

我先用 uptime 看 1、5、15 分钟 Load,并和 CPU 核数比较,再看 CPU 使用率。如果 Load 和 user CPU 同时高,继续定位计算热点线程;如果 Load 很高但 CPU 不高,重点检查 D 状态进程,通常是磁盘、网络存储或内核 I/O 卡住。可以用 vmstat 看运行队列和阻塞数,用 iostat -x 看磁盘延迟、队列和利用率,用 pidstat -d/-w 找 I/O 或上下文切换异常的进程。

关键细节

  • Load Average 不是 CPU 使用率,Linux 会把不可中断睡眠的任务也计入 Load。
  • 单看 iowait 不能完整判断 I/O,需结合设备延迟、队列长度和吞吐。
  • 大量短线程、锁竞争和频繁上下文切换也可能推高运行队列。
  • NFS、云盘、容器存储故障常表现为进程 D 状态和 Load 飙升。

面试官追问

  1. Load 为多少算高?
  2. Load 高但 CPU 空闲怎么解释?
  3. D 状态进程能否被 kill -9?
  4. 如何区分磁盘慢和应用写入放大?

面试官追问参考答案

1. Load 为多少算高?

没有绝对值,要结合可用 CPU 核数、历史基线和任务类型。长期 CPU 密集场景中,Load 接近核数说明资源接近饱和,明显高于核数表示队列积压;但 D 状态 I/O 任务也计入 Load,所以必须结合 CPU 和阻塞指标判断。

2. Load 高但 CPU 空闲怎么解释?

大量进程可能处于不可中断睡眠 D 状态,等待磁盘、NFS 或块设备 I/O,它们计入 Load 却不消耗 CPU。检查 vmstat 的 b、ps 状态、iostat 延迟和内核日志可定位具体设备。

3. D 状态进程能否被 kill -9?

信号会被记录,但进程处于不可中断内核等待时无法立即处理,只有 I/O 返回并回到可调度状态后才会退出。根因应处理故障设备、挂载或驱动,强杀不是有效即时方案。

4. 如何区分磁盘慢和应用写入放大?

结合设备层 await、队列长度、吞吐和利用率,与应用实际业务写入字节、系统调用、日志/RDB/临时文件写入量对比。设备在低吞吐下仍高延迟更像存储异常;物理写远大于业务写则说明日志、压缩、合并或小随机写造成放大。

学习清单

  • 理解运行队列、D 状态和 Load Average。
  • 会联合解读 vmstat、iostat 和 pidstat。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章