您的位置:首页 >Linux面试:loadaverage很高,CPU为什么不忙?
发布于2026-08-13 阅读(0)
扫一扫,手机访问
后端秋招里很爱问这种题:
一台 8 核 Linux 机器,load a verage 已经到 18,但 CPU 还有 80% idle。为什么?你会怎么排?不少人看到 load 到 18,第一反应是 CPU 被打满了。这个判断不够。
Linux 的 load a verage 统计的,可不只是那些正在占着 CPU、或者排队等 CPU 的任务。按照 proc_loada vg(5) 的定义,运行队列里的 R 状态任务,以及等待磁盘 I/O 的 D 状态任务,都会被一起算进去。
所以会出现一个乍看矛盾的现场:load 很高,CPU 却没怎么忙。进程不是在排队等 CPU,而是在等 I/O。

我会先问机器有多少核,再连续取样,而不是拿一张 top 截图下结论:
nproc
uptime
vmstat 1 5uptime 里的三个数字常被叫作 1、5、15 分钟平均负载。更准确地说,它们是指数衰减后的值,不是三个窗口里简单做算术平均。
真正用于分流的是 vmstat。看第二次以后的采样,第一行是开机以来的平均值,容易误导。
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 27 0 814920 44280 930112 0 0 18240 1024 2310 4180 5 2 81 12这组示例里,r=1,说明等 CPU 的任务不多;b=27,说明有一批任务被 I/O 阻塞。CPU 的 id 还有 81%,就不该继续沿着“找 CPU 热点线程”往下查。
如果是 r 持续很高,同时 us 或 sy 也高,那才是另一条路:找高 CPU 进程、线程,再定位调用栈。
先把 D 状态进程列出来:
ps -eo state,pid,ppid,comm,wchan:32 --sort=state |
awk '$1 == "D" || NR == 1'D 是不可中断睡眠,常见于块设备、NFS 等 I/O 等待,但不能看见 D 就直接宣布“磁盘坏了”。wchan 能给出任务睡在哪个内核等待点;权限不足时它可能显示成 -。
接着看设备和进程的 I/O:
iostat -xz 1 5
pidstat -d 1 5这里我主要看两件事:哪个设备的请求延迟在涨,哪个进程持续发出读写。若 D 状态都指向网络挂载,还要顺着 NFS 服务端、网络和挂载点查,别只盯本地盘。
排查时也别急着重启。重启可能让告警暂时消失,但 D 状态、等待点和当时的 I/O 指标也一起没了。至少先留一轮 vmstat、D 状态进程和 iostat。
我会把回答压到四十秒左右:
Linux 的 load a verage 不是 CPU 使用率。它包含 R 状态的可运行任务,也包含 D 状态的不可中断等待任务。load 高但 CPU idle 仍然高时,我先用 vmstat 连续采样,看 r 和 b。r 高且 CPU 忙,沿 CPU 热点查;b 高且 CPU 空闲,列出 D 状态进程,再用 wchan、iostat 和 pidstat 找到具体设备或进程。如果涉及 NFS,再查网络挂载和服务端。重启前先保留现场。复习这类题时,比较有效的做法是把这段回答放进面灵的模拟面试里,再刻意让它继续追问“为什么 D 也算 load”“vmstat 第一行能不能信”。说白了,第二问往往比死记十条命令更能看出一个人到底有没有真正排过故障。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9