当前位置: 首页 > 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.cnnetsun.cn/news/2998944.html

相关文章:

  • O-RAN中基于Transformer-ESN混合架构的KPI降维与预测优化
  • 基于Hadoop的番茄小说阅读量数据的分析与运用
  • AI开发可观测性实践:构建成本追踪与代码质量监控体系
  • 基于深度强化学习的多目标SAR无人机智能路径规划实战解析
  • OASIS框架:基于分层事件记忆的长视频流式理解技术解析
  • 基于视觉语言与扩散模型的自动驾驶场景生成技术解析
  • Trae:重构编程工作流的操作系统级AI开发工具
  • GitHub学生认证失败真相:不是打不开,而是信源不匹配
  • Codex本地技能调度器:解析.skill.md与配置原理
  • Claude API如何通过MCP协议接入VS Code与Playwright
  • OpenCode 部署指南:Node.js 环境配置与本地 AI 编程运行时搭建
  • C++标准库拷贝与替换算法原理及工程实践
  • 混元2.0深度实测:国产大模型结构化理解与工程稳定性解析
  • 多时序多视角输入加速:IRL输入规整层工程实践
  • Claude Ultracode Agent View:面向工程规模化AI开发的并行调度与可观测性实践
  • Burp Suite实战指南:从代理抓包到漏洞扫描的Web安全测试全流程
  • C语言独立加密库实现:MD5/SHA1/SHA256源码解析与工程实践
  • Java Selenium自动化测试框架搭建:从POM模式到数据驱动的工程实践
  • 微信链接被拦截?三步申诉指南与预防策略
  • 构建UI与API融合的自动化测试框架:工程实践与效能提升指南
  • Web自动化测试工具深度对比:Selenium、Cypress、Playwright与Puppeteer选型指南
  • KT0605无线话筒发射端Keil工程包,含C8051F310驱动、FM调制、LCD按键与I2C/SPI完整实现
  • DVWA文件上传High级绕过:图片马、GIF注释与竞争条件攻击实战
  • 文件格式伪装原理与Apate工具实战:从魔数识别到攻防对抗
  • CVE-2017-17733漏洞复现:从PHP eval()到远程命令执行实战
  • 制作5G新时代科学知识页面
  • 鸿蒙 Next 小众爱好图鉴 App 开发实战:兴趣发现 + 分类系统 + 收藏管理
  • MedPlanning影像规划助手最新中文版本
  • 多卡张量并行配置指南,让 Instinct GPU 集群火力全开
  • NeuN:神经元特异性核蛋白的多维生物学特性及其在神经科学研究中的关键作用