Appearance
load average(系统负载)—— 三个数字背后的真实含义
uptime输出的load average: 2.50, 2.00, 1.80,人人都说"大于 CPU 核心数就是过载",这句话对吗?负载到底统计的是什么?为什么%idle=90%的时候负载却能到 10?本文澄清 Linux 负载指标的真实语义。
更新时间:2026-08-06
一、定义:load average 统计的到底是什么
load average 的三个数字分别代表过去 1 分钟 / 5 分钟 / 15 分钟的系统平均负载。
被统计的对象:处于**可运行(R 态,TASK_RUNNING)或不可中断睡眠(D 态,TASK_UNINTERRUPTIBLE)**状态的进程数量。
| 状态 | 是否计入负载 | 含义 |
|---|---|---|
| R(运行/就绪) | 是 | 正在 CPU 上跑 + 在运行队列排队等 CPU |
| D(不可中断睡眠) | 是 | 卡在磁盘 I/O、Swap 的进程 |
| S(可中断睡眠) | 否 | 正常阻塞在网络 I/O、锁等待、epoll 的进程 |
| T(停止) | 否 | 被 SIGSTOP 暂停的进程 |
| Z(僵尸) | 否 | 已退出但未被 wait 回收 |
核心认知:load average ≠ CPU 使用率!负载统计的是"正在做事 + 想做但被 IO 卡住的"进程数。100 个进程卡在 D 态等磁盘,CPU 可能 100% idle,但 load average = 100——负载高不一定 CPU 忙。
二、数据源与计算方式
2.1 数据源:/proc/loadavg
bash
$ cat /proc/loadavg
2.50 2.00 1.80 3/1024 12345| 字段 | 含义 |
|---|---|
2.50 2.00 1.80 | 1 / 5 / 15 分钟负载 |
3/1024 | 当前正在运行/就绪的线程数 / 系统总线程数 |
12345 | 最近创建的进程 PID |
2.2 内核计算算法
内核并不每时每刻都精确统计——而是在每个**定时器中断(tick)**时采样,然后用指数加权移动平均(EWMA,Exponentially Weighted Moving Average)平滑:
每次 tick 采样一次
nr_active = nr_running + nr_uninterruptible用以下公式计算:
load(t) = load(t-1) × e^(-t/T) + n × (1 - e^(-t/T))其中 T = 1min / 5min / 15min,n 是当前采样值
关键含义:1 分钟负载对最近的采样权重最大(响应快),15 分钟负载平滑度最高(反映趋势)。这就是为什么突发负载来了,1 min 先涨,5 min 慢慢涨,15 min 最后才到。
三、三个常见误区
误区一:"负载 > CPU 核心数 = 过载"
不完全对。负载包含 D 态进程。如果 8 核机器上 30 个进程卡在 D 态(磁盘慢),负载 = 30,但 CPU 完全空闲。此时 CPU 确实没有过载——瓶颈在磁盘。
正确判断方式:同时看 vmstat 1 的 r 列(运行队列长度):
r> CPU 核心数 → CPU 确实过载r小但负载高 → D 态进程堆积,检查磁盘
误区二:"负载低 = 系统健康"
错。负载不计入 S 态(网络 I/O 阻塞)。10000 个进程阻塞在 read() 等网络数据,load average ≈ 0,但系统可能已经快被连接数打崩了。
误区三:"负载 1.0 就是单核 cpu 利用率 100%"
错。负载是进程数量,CPU 利用率是时间百分比。一个计算密集进程能把单核 %usr 打到 100%,负载 = 1.0。但 10 个进程轮流用 CPU(每个占用 10ms 然后 sleep),负载还是约 0-1,%usr 却是 100%——因为 CPU 时间被充分填充,但同一时刻只有一个活跃进程。
四、与其他指标的联动判断
| 组合 | 含义 | 排查方向 |
|---|---|---|
负载高 + %idle 低 + r 高 | CPU 瓶颈 | 降低计算量、扩展核心数、优化算法 |
负载高 + %iowait 高 + r 低 | 磁盘 I/O 瓶颈 | iostat -x 1、pidstat -d 1,定位慢磁盘 |
负载高 + %idle 高 + r 低 | D 态进程堆积但没产生 iowait(可能 CPU 被抢占) | pidstat -d 1 直接看 iodelay,不需依赖 %iowait |
| 负载低 + 业务响应慢 | S 态阻塞(网络/锁) | pidstat -w 1 看 cswch/s,strace -p PID 看阻塞系统调用 |
五、一句话总结
load average 统计的是 R 态(需要 CPU)+ D 态(等磁盘 I/O)的进程数量,不是 CPU 使用率。它用 EWMA 算法从 tick 采样值平滑得到三个时间窗口的均值——1 分钟负载反映当前压力,15 分钟负载反映长期趋势。判断"是否过载"需要结合 vmstat 的 r 列(运行队列)和 %iowait:r 高 = CPU 瓶颈,r 低 + 负载高 = D 态堆积 = 磁盘瓶颈。