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 核 CPUload 1.0大概表示刚好一个任务持续占满 CPU如果load 2.0表示平均有 2 个任务需要 CPU / 资源 1 个在跑1 个在等单核下可以粗略理解load状态 1资源有余量≈ 1基本打满 1有排队 1压力明显6.2 四核机器如果是 4 核 CPUload 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_blocked12.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 等待上。