什么是 Load(负载)?
一则或许对你有用的小广告
欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书
《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于
Spring AI + Spring Boot 3.x + JDK 21...,查看介绍《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,查看介绍;演示链接:http://116.62.199.48:7070/《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/
新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍
截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观
面试考察点
- 基础掌握度:面试官想知道你是否清楚 Load(负载)的定义,能否区分 Load、CPU 利用率、CPU 核心数这些容易混淆的概念
- 线上排障意识:很多面试官问这题,重点不在概念,而在你会不会用 Load 分析线上问题。比如 Load 飙升怎么排查
- 原理理解深度:Load 到底统计了哪些进程状态?为什么 Load 高的时候 CPU 利用率反而可能很低?
核心答案
先给个一句话结论:
Load(系统平均负载,Load Average)= 在一段时间内,系统中处于 "可运行状态" 和 "不可中断睡眠状态" 的进程的平均数量。
执行 top 或 uptime 命令,能看到这么一行:
这三个数字分别是过去 1 分钟、5 分钟、15 分钟 的平均负载。
判断负载高不高的标准:拿 Load 和 CPU 核心数比较。
| 场景 | 判断 |
|---|---|
| Load < CPU 核心数 | 正常,CPU 还有富余 |
| Load ≈ CPU 核心数 | 临界,刚好打满 |
| Load > CPU 核心数 | 过载,进程在排队等 CPU |
比如 4 核机器,Load 到 4 就是满负荷,到 8 就说明一半进程在排队。
深度解析
一、Load 统计了哪些进程?
这是这道题的核心,也是很多人答不出来的点。
Load 统计的进程处于两种状态:
- R(
TASK_RUNNING)可运行状态:正在 CPU 上跑,或者在就绪队列里等 CPU - D(
TASK_UNINTERRUPTIBLE)不可中断睡眠状态:等待 I/O(比如磁盘、网络),此时进程不能被信号打断
上图把 Linux 的进程状态和 Load 的关系理了一遍。关键就两点:
- 只有 R 和 D 两种状态计入 Load
- 其他状态(S、T、Z)都不算
为什么要算 D 状态? 这个设计是 Linux 早期为了让 Load 反映 "系统整体繁忙程度",不只是 CPU 瓶颈。D 状态通常是等磁盘 I/O,这种进程虽然不占 CPU,但它也在等资源,系统其实也很忙。
二、Load vs CPU 利用率
这俩最容易搞混。
| 指标 | 反映什么 | 衡量维度 |
|---|---|---|
| CPU 利用率 | CPU 在 "干活" 的时间占比 | 百分比 |
| Load(平均负载) | 系统的繁忙程度(含等 I/O) | 进程数量 |
举个具体场景帮你区分:
- 场景 1:CPU 密集任务。比如一个死循环程序。CPU 利用率飙升到 100%,Load 也会跟着升到 1(单核场景)
- 场景 2:大量磁盘 I/O。比如数据库在做全表扫描。Load 可能飙到几十,但 CPU 利用率只有 20%。因为大量进程卡在 D 状态等磁盘
线上排查的时候,记住一个组合:
- Load 高 + CPU 利用率也高 → CPU 瓶颈,找哪个进程在烧 CPU
- Load 高 + CPU 利用率很低 → 大概率是 I/O 瓶颈(磁盘慢、网络卡),用
iostat、iotop查 - Load 低 + CPU 利用率低 → 系统闲着
- Load 低 + CPU 利用率高 → 几乎不会出现(除非 Load 瞬间还没刷新上来)
三、Load 是怎么算出来的?
Linux 内核里,每 5 秒(5*HZ)统计一次活跃进程数,然后用指数加权移动平均(EWMA) 算出 1/5/15 分钟的平均值。
公式大致是:
load1 = load1 * exp(-5/60) + active * (1 - exp(-5/60))
load5 = load5 * exp(-5/300) + active * (1 - exp(-5/300))
load15 = load15 * exp(-5/900) + active * (1 - exp(-5/900))
这个算法的特点:新的采样数据权重高,老数据权重指数衰减。所以:
- 1 分钟 Load 对突发负载反应最快,但也最容易抖动
- 15 分钟 Load 最平滑,反映长期趋势
线上排查时,三个数字一起看:
load average: 10.0, 2.0, 1.0
这种 "1 分钟远高于 15 分钟" 的形态,说明刚刚发生了突发负载,正在恢复或者刚刚起来还没平。
四、查看 Load 的常用命令
# 最常用:top / uptime / w
$ uptime
10:30:45 up 10 days, 2:15, 3 users, load average: 1.50, 1.20, 0.80
# 直接读内核数据
$ cat /proc/loadavg
1.50 1.20 0.80 2/150 12345
# 分别是:1/5/15分钟 load + 正在运行/总进程 + 最近创建的 PID
# 看多少核
$ nproc
4
$ lscpu | grep "^CPU(s):"
CPU(s): 4
五、生产环境中的排查思路
Load 飙高怎么排查?给你一套通用思路:
- 先看 Load 三个数字的形态:判断是突发还是持续
- 配合 CPU 利用率看:区分是 CPU 瓶颈还是 I/O 瓶颈
- 找最忙的进程:
top按P(CPU)或按内存排序,pidstat -u 1看每个进程的 CPU - 如果怀疑 I/O:
iostat -x 1、iotop查磁盘负载 - 如果怀疑是上下文切换:
vmstat 1看cs(context switch)列,太多说明线程频繁切换 - 看是不是 D 状态进程多:
ps -e -L -o state,pid,cmd | grep "^D"列出所有 D 状态进程
面试高频追问
-
Load 多少算高?
看核心数。准确说要看相对值,也就是 Load ÷ CPU 核心数。一般经验:相对值 < 0.7 健康,> 0.7 要关注,> 1.0 就在过载边缘,> 5.0 就是严重问题了。4 核 CPU 对应就是 2.8 / 4 / 20。
-
为什么 Load 高的时候 CPU 利用率可能很低?
大量进程卡在 D 状态等 I/O,不占 CPU 但计入 Load。这种情况典型见于磁盘慢、NFS 卡、内存不足导致频繁 swap。
-
怎么定位 Load 高的原因?
组合拳:
top看进程 +iostat看磁盘 +vmstat看上下文切换 +ps找 D 状态进程。 -
Load 和进程数有啥关系?
不是一回事。Load 只统计 R 和 D 状态进程。系统可能有几千个进程(大多在 S 睡眠),但 Load 只有 0.x。
常见面试变体
- "Load 和 CPU 利用率有什么区别?"
- "Load 多少算正常?怎么判断?"
- "线上 Load 突然飙高,你怎么排查?"
- "为什么有时候 Load 很高但 CPU 很闲?"
记忆口诀
Load = R 状态 + D 状态(Running + Disk wait)
判断系统忙不忙,拿 Load 和核心数比就行,前者大于后者就是过载。
总结
Load(平均负载)的本质就是 系统里 "在跑" 和 "在等 I/O" 的进程的平均数。看 Load 一定配合 CPU 利用率一起看,能快速区分是 CPU 瓶颈还是 I/O 瓶颈。线上排查记住三步:看形态、配合 CPU 利用率、定位具体进程和资源。
