什么是 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+ 小伙伴加入学习,欢迎点击围观

面试考察点

  1. 基础掌握度:面试官想知道你是否清楚 Load(负载)的定义,能否区分 Load、CPU 利用率、CPU 核心数这些容易混淆的概念
  2. 线上排障意识:很多面试官问这题,重点不在概念,而在你会不会用 Load 分析线上问题。比如 Load 飙升怎么排查
  3. 原理理解深度:Load 到底统计了哪些进程状态?为什么 Load 高的时候 CPU 利用率反而可能很低?

核心答案

先给个一句话结论:

Load(系统平均负载,Load Average)= 在一段时间内,系统中处于 "可运行状态" 和 "不可中断睡眠状态" 的进程的平均数量。

执行 topuptime 命令,能看到这么一行:

Load Average 示例
Load Average 示例

这三个数字分别是过去 1 分钟、5 分钟、15 分钟 的平均负载。

判断负载高不高的标准:拿 Load 和 CPU 核心数比较

场景 判断
Load < CPU 核心数 正常,CPU 还有富余
Load ≈ CPU 核心数 临界,刚好打满
Load > CPU 核心数 过载,进程在排队等 CPU

比如 4 核机器,Load 到 4 就是满负荷,到 8 就说明一半进程在排队。

Load 与 CPU 核心数
Load 与 CPU 核心数

深度解析

一、Load 统计了哪些进程?

这是这道题的核心,也是很多人答不出来的点。

Load 统计的进程处于两种状态:

  • R(TASK_RUNNING)可运行状态:正在 CPU 上跑,或者在就绪队列里等 CPU
  • D(TASK_UNINTERRUPTIBLE)不可中断睡眠状态:等待 I/O(比如磁盘、网络),此时进程不能被信号打断

Load 统计进程状态
Load 统计进程状态

上图把 Linux 的进程状态和 Load 的关系理了一遍。关键就两点:

  • 只有 R 和 D 两种状态计入 Load
  • 其他状态(S、T、Z)都不算

为什么要算 D 状态? 这个设计是 Linux 早期为了让 Load 反映 "系统整体繁忙程度",不只是 CPU 瓶颈。D 状态通常是等磁盘 I/O,这种进程虽然不占 CPU,但它也在等资源,系统其实也很忙。

Load 统计进程状态
Load 统计进程状态

二、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 瓶颈(磁盘慢、网络卡),用 iostatiotop
  • Load 低 + CPU 利用率低 → 系统闲着
  • Load 低 + CPU 利用率高 → 几乎不会出现(除非 Load 瞬间还没刷新上来)

Load 与 CPU 利用率
Load 与 CPU 利用率

三、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 趋势排查
Load 趋势排查

  1. 先看 Load 三个数字的形态:判断是突发还是持续
  2. 配合 CPU 利用率看:区分是 CPU 瓶颈还是 I/O 瓶颈
  3. 找最忙的进程topP(CPU)或按内存排序,pidstat -u 1 看每个进程的 CPU
  4. 如果怀疑 I/Oiostat -x 1iotop 查磁盘负载
  5. 如果怀疑是上下文切换vmstat 1cs(context switch)列,太多说明线程频繁切换
  6. 看是不是 D 状态进程多ps -e -L -o state,pid,cmd | grep "^D" 列出所有 D 状态进程

面试高频追问

  1. Load 多少算高?

    看核心数。准确说要看相对值,也就是 Load ÷ CPU 核心数。一般经验:相对值 < 0.7 健康,> 0.7 要关注,> 1.0 就在过载边缘,> 5.0 就是严重问题了。4 核 CPU 对应就是 2.8 / 4 / 20。

  2. 为什么 Load 高的时候 CPU 利用率可能很低?

    大量进程卡在 D 状态等 I/O,不占 CPU 但计入 Load。这种情况典型见于磁盘慢、NFS 卡、内存不足导致频繁 swap。

  3. 怎么定位 Load 高的原因?

    组合拳:top 看进程 + iostat 看磁盘 + vmstat 看上下文切换 + ps 找 D 状态进程。

  4. 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 利用率、定位具体进程和资源。