当前位置: 首页 > news >正文

03. 从零带你学习Linux内核:proc

/proc/loadavg

这一节核心解决一个问题:

load average 不是 CPU 使用率。它更像“系统当前有多少任务在排队等资源”。

你之前学的/proc/stat是算 CPU 使用率;现在的/proc/loadavg是看系统负载压力。两者相关,但不是一个东西。


1. 先看/proc/loadavg输出

执行:

cat/proc/loadavg

可能看到:

0.45 0.12 0.04 4/125 5549

或者:

1.06 0.84 0.77 1/871 44089

文章里也解释了,/proc/loadavg保存 CPU 和磁盘 I/O 相关的负载平均值,前三列类似uptime命令里的 load average;第四列是当前调度实体数量信息,第五列是最近创建的 PID。


2. 每一列是什么意思

以这个为例:

0.45 0.12 0.04 4/125 5549
字段含义
0.45最近 1 分钟平均负载
0.12最近 5 分钟平均负载
0.04最近 15 分钟平均负载
4/125当前正在运行或可运行的任务数 / 当前系统总调度实体数
5549最近创建的进程 PID

你先重点记前三个:

1分钟负载 / 5分钟负载 / 15分钟负载

它们用来看系统压力趋势。


3. load average 到底表示什么

小白版:

load average 表示一段时间内,系统中有多少任务正在运行,或者正在等 CPU / I/O 等资源。

更准确地说,Linux 的 load average 统计的是:

可运行状态任务 TASK_RUNNING + 不可中断睡眠状态任务 TASK_UNINTERRUPTIBLE

你可以理解成两类任务:

1. 正在 CPU 上跑,或者等 CPU 调度的任务 2. 卡在不可中断 I/O 等待里的任务,比如等磁盘

所以 load 高不一定是 CPU 忙,也可能是 I/O 卡住。


4. 为什么 load average 不是 CPU 使用率

CPU 使用率是百分比:

CPU 使用率 = CPU 这一段时间忙了多少比例

比如:

CPU 使用率 80%

表示 CPU 80% 时间在执行任务。

但 load average 是任务队列压力:

load average = 平均有多少个任务处于运行/等待资源状态

比如:

load = 4.0

表示平均有大约 4 个任务处于运行或等待资源状态。

所以二者不是一个量纲。

指标来自哪里含义单位
CPU 使用率/proc/statCPU 忙碌时间比例百分比
load average/proc/loadavg平均活跃/等待任务数任务数量

5. 一个最简单的类比

把 CPU 想成食堂打饭窗口。

CPU 使用率

窗口有多忙:

窗口 80% 时间都在打饭 => CPU 使用率 80%

load average

有多少人在排队:

平均有 5 个人在窗口前排队/打饭 => load average 约 5

所以可能出现几种情况:

情况CPU 使用率load average说明
窗口一直忙,但队伍不长中等CPU 忙,但还扛得住
窗口不忙,但很多人卡在等菜可能是 I/O 阻塞
窗口忙,队伍也很长CPU 资源紧张
窗口不忙,队伍也没人系统很空闲

6. load 怎么判断高不高

关键看CPU 核数

因为 load 是任务数量,不是百分比。

6.1 单核机器

如果是 1 核 CPU:

load = 1.0

大概表示:

刚好一个任务持续占满 CPU

如果:

load = 2.0

表示:

平均有 2 个任务需要 CPU / 资源 1 个在跑,1 个在等

单核下可以粗略理解:

load状态
< 1资源有余量
≈ 1基本打满
> 1有排队
>> 1压力明显

6.2 四核机器

如果是 4 核 CPU:

load = 4.0

才大致表示 CPU 刚好满载。

load = 2.0

对 4 核来说不算高,因为 4 个核心能同时处理 4 个任务。

四核下粗略看:

load状态
< 4大体有余量
≈ 4接近满载
> 4开始排队
>> 4压力明显

所以判断公式可以先记:

load / CPU 核数

例如:

4 核机器 load = 2 => 2 / 4 = 50% => 大体还可以
4 核机器 load = 8 => 8 / 4 = 200% => 平均任务数是核心数的 2 倍,可能排队严重

7. 1 分钟、5 分钟、15 分钟怎么看趋势

/proc/loadavg前三列:

0.45 0.12 0.04

表示:

1分钟 load = 0.45 5分钟 load = 0.12 15分钟 load = 0.04

看趋势:

7.1 1 分钟 > 5 分钟 > 15 分钟

例如:

5.0 2.0 1.0

说明:

最近压力正在升高

可能是刚来了流量、刚开始压测、某个任务突然跑起来。


7.2 1 分钟 < 5 分钟 < 15 分钟

例如:

1.0 2.0 5.0

说明:

压力正在下降

可能刚才高峰过去了。


7.3 三个值都高

例如 4 核机器:

8.0 7.5 7.2

说明:

系统长期处于高负载

这比短暂 1 分钟高更危险。


8. load 高可能是什么原因

不要看到 load 高就说 CPU 高。

load 高常见有三种原因。

8.1 CPU 计算压力大

现象:

load 高 CPU 使用率也高 iowait 不高

说明:

大量任务在抢 CPU

例如:

死循环 大量计算任务 压测 QPS 太高 线程池过大

8.2 I/O 阻塞严重

现象:

load 高 CPU 使用率不高 iowait 高 procs_blocked 高

说明:

很多任务不是在用 CPU,而是卡在磁盘 / 网络存储 / 块设备 I/O

这就是为什么/proc/stat/proc/loadavg要一起看。


8.3 线程/进程过多

现象:

load 高 上下文切换 ctxt 增长快 procs_running 高

说明:

调度压力大,任务太多,CPU 时间片被频繁切换

这时候可能不是单个任务慢,而是系统被大量线程拖垮。


9. 和/proc/stat怎么配合看

你可以按这个诊断表来理解。

/proc/loadavg/proc/statCPU 使用率iowait判断
CPU 计算压力大
低/中I/O 阻塞,磁盘或存储慢
可能线程多、上下文切换多
CPU 有任务但没有明显排队
系统空闲

关键结论:

/proc/stat告诉你 CPU 时间花在哪;/proc/loadavg告诉你系统有没有任务积压。


10. 和procs_running / procs_blocked的关系

上一节/proc/stat里有两个字段:

procs_running procs_blocked

文章也写到,procs_running是当前运行队列任务数,procs_blocked是当前阻塞任务数。

这两个可以辅助解释 load:

字段含义
procs_running当前正在运行或等待 CPU 的任务数量
procs_blocked当前阻塞等待 I/O 的任务数量

如果:

load 高 procs_running 高

偏 CPU 调度压力。

如果:

load 高 procs_blocked 高

偏 I/O 阻塞压力。


11. 放到你的性能监控项目里

你的项目里 Worker 会采集 CPU、内存、磁盘、网络、软中断等指标。其中 CPU Load 可以优先从内核模块 +mmap读取,失败后 fallback 到/proc/loadavg;这体现了项目里“字符设备/mmap + procfs 双路径”的设计。

项目数据流可以这样理解:

Worker 读取 /proc/loadavg ↓ 解析 1min / 5min / 15min load ↓ MetricCollector 聚合到 MonitorInfo ↓ MonitorPusher 通过 gRPC Push 到 Manager ↓ HostManager 把 load 作为健康评分的一部分 ↓ MySQL 落库,QueryService 后续查询趋势

项目源里也强调,Worker 不是每个指标单独发 RPC,而是一轮采样统一聚合成一个MonitorInfo再发;低频指标包括/proc/loadavg/proc/meminfo/proc/diskstats


12. 面试官最可能追问

12.1 load average 和 CPU 使用率有什么区别?

标准答法:

CPU 使用率表示 CPU 在采样时间内忙碌的比例,通常通过/proc/stat两次采样差分计算。load average 表示一段时间内系统中处于可运行状态或不可中断睡眠状态的任务平均数量,它不是百分比。CPU 使用率高说明 CPU 忙,load 高说明任务有积压。load 高可能是 CPU 忙,也可能是大量任务卡在 I/O 上。

项目分析资料里也明确提醒:load average 反映可运行队列和不可中断睡眠任务数量,不等于 CPU 百分比,I/O 阻塞也可能拉高 load。


12.2 load 是不是越低越好?

不是绝对。

如果一台 8 核机器:

load = 3

很正常,说明资源还有余量。

如果一台 1 核机器:

load = 3

就很危险,说明平均 3 个任务竞争 1 个核心或等待资源。

所以必须结合:

CPU 核数 CPU 使用率 iowait procs_running procs_blocked

12.3 为什么 CPU 使用率低,但 load 很高?

常见原因是 I/O 阻塞。

例如:

大量请求访问磁盘 磁盘响应很慢 进程进入不可中断睡眠 D 状态 CPU 没有满载 但 load 被这些 D 状态任务拉高

所以:

CPU 低 + load 高 + iowait 高 => 优先怀疑磁盘 / 存储 / I/O 问题

13. 小白最小记忆版

你背这几句:

/proc/loadavg 看的是系统负载,不是 CPU 使用率。 前三个数分别是 1分钟、5分钟、15分钟平均负载。 load 表示平均有多少任务正在运行或等待资源。 判断 load 高不高,要除以 CPU 核数。 CPU 使用率高表示 CPU 忙;load 高表示任务有积压。 CPU 低但 load 高,通常要怀疑 I/O 阻塞。

14. 面试版一句话

/proc/loadavg记录系统 1 分钟、5 分钟、15 分钟的平均负载。它不是 CPU 使用率,而是系统中处于可运行状态或不可中断睡眠状态的任务平均数量。判断 load 是否异常要结合 CPU 核数、CPU 使用率、iowait、procs_running 和 procs_blocked。如果 CPU 使用率低但 load 很高,通常说明大量任务卡在 I/O 等待上。

http://www.jsqmd.com/news/1072657/

相关文章:

  • 图卷积网络与约束感知学习在动态微电网恢复中的应用
  • 基于通道注意力的跨模态知识蒸馏:轻量化指代图像分割实践
  • 大语言模型可解释性新路径:Introspection Adapters原理与实战
  • 2026年LLM API智能路由:多模型网关的工程选型与实战
  • 多模态欺骗检测:融合动态情感与人格特征的AI测谎新思路
  • 自动化内容审核如何应对社群语言重申:技术挑战与破局思路
  • 基于Stackelberg博弈与可排空性护栏的GPU云平台定价与扩缩容策略
  • AI生成代码的审查危机与治理策略:从公地悲剧到工程防线
  • 基于项链枚举的分布式联盟生成与负载均衡算法实践
  • 成都LED显示屏维修哪家好又靠谱
  • DailyTech-20260622
  • 大语言模型自进化代理的行为漂移:经验记忆如何侵蚀AI安全边界
  • 硅光子打破功耗墙:AI训练能耗降低60%,台积电2026年量产CPO
  • 从维基百科到学术圈:非正式同行评审的治理机制与平台实践
  • 分布式图Transformer训练:自适应并行策略与稀疏算子优化实践
  • Navier-Stokes方程条件正则性研究及优化方法应用
  • O-RAN中基于Transformer-ESN混合架构的KPI降维与预测优化
  • 大语言模型置信度校准:CaOPD框架原理与工程实践
  • 锂离子电池降阶模型解析:从DFN到SPMe的工程实现与优化
  • 智能体进化与高效上下文管理:基于GA与记忆压缩的工程实践
  • 视网膜电图技术解析:从原理到在神经发育障碍研究中的应用
  • 量子电路切割技术在变分量子分类器中的应用与优化
  • HarmChip:首个面向硬件安全的LLM越狱基准测试与安全评估
  • RDDG框架深度解析:基于LLM的动态引导式结构化数据生成实践
  • 从NMF到BLUTH:高光谱解混算法演进与工程实践
  • 基于生物物理信息深度学习的DNA分子动力学轨迹可视化框架ViDa详解
  • berkeley db(BDB)详解
  • Tree of Concepts:构建可解释、持续学习的临床知识图谱框架
  • AI始祖的自我终结:73年思考后的选择
  • Codex CLI国内实战指南:协议适配型大模型命令行工具详解