CPU 与调度60 条

/proc/loadavg 字段速读

实时负载视图:三个均值 + 当前运行任务/总任务数 + 最近创建进程 PID,排查时可即时判断忙闲。

loadavg 是什么

Linux 的 /proc/loadavg 是一行五段文本,依次是 1、5、15 分钟平均负载、当前可运行任务数与系统任务总数、以及最近创建的进程 PID。这里的负载不等于 CPU 使用率:Linux 把处于 D 状态(不可中断睡眠,多在等磁盘或网络存储)的任务也计入,所以它衡量的是「正在运行或卡在等待」的任务规模,量纲与逻辑核数相同——单核满载约等于 1。

基本信息

读取路径/proc/loadavg,uptime 与 top 首行同源
字段数5 段:1min 5min 15min 运行中/总任务 最近PID
时间常数指数平滑,分别约 1、5、15 分钟
比较基准逻辑核数(nproc、lscpu)
读写属性procfs 只读,无需权限

典型使用场景

  • 登录后第一眼判断忙闲:远低于核数说明空闲,接近或超过说明已饱和
  • 区分 CPU 忙与 I/O 阻塞:负载高而 mpstat 的 %idle 仍高,多半是 D 状态堆积
  • 容量决策:15 分钟均值长期贴着核数,说明这台机器再压就排队
  • 脚本采集告警:用 awk 取第一段做阈值判断,配合时间戳留档
  • 故障复盘:与监控 CPU 曲线对照,判断故障期间是否出现排队

读取与现场确认

读取与现场确认
cat /proc/loadavg          # 一行原始数据,最省事的读法
uptime                     # 带开机时长与负载的常规视图
nproc                      # 逻辑核数,负载的比较基准
awk '{print $1}' /proc/loadavg   # 取 1 分钟均值做脚本判断
vmstat 1 3                 # r 列是瞬时运行队列长度,比均值及时
ps -eo state,pid,comm | awk '$1 ~ /^D/'   # 谁卡在 I/O 等待里
cat /proc/stat | grep procs  # procs_running 与 procs_blocked 原始计数

字段逐列读法

字段含义正常与异常
第 1 段1 分钟平均负载反应最快,持续高于逻辑核数即为过载
第 2 段5 分钟平均负载与 1 分钟配合判断趋势方向
第 3 段15 分钟平均负载高而 1 分钟已回落,说明压力刚缓解
第 4 段运行中任务/任务总数分子长期大于核数即排队,分母是整机任务规模
第 5 段最近创建的进程 PID仅作提示,不用于容量判断
负载是内核按指数衰减平滑出来的,瞬时尖峰被摊平;要抓瞬时排队要看 vmstat 的 r 列或 /proc/stat 的 procs_running。
把 D 状态计入负载是 Linux 特有的口径,与 BSD/Unix 系不同,同样的数字在两种系统上含义并不等价。
容器内读到的是宿主机整机负载,不代表容器自身压力;容器视角应看 cgroup 的 cpu.stat(nr_throttled、throttled_usec)与 cpu.pressure。

易错点

  • 把平均负载当 CPU 使用率:D 状态大量存在时负载很高而 CPU 空闲,此时该查 iostat 与存储链路而不是加 CPU
  • 用固定阈值 1.0 告警:多核机器必须除以 nproc,否则 32 核机器负载 20 就误报、负载 60 反而漏报
  • 只看 1 分钟值下结论:1 分钟高而 15 分钟低是脉冲,反之才是持续压力,三个均值要一起读
  • 在容器里用 /proc/loadavg 判断自身负载:数据来自宿主整机,容器应按 cgroup 压力指标判断
  • 忽略负载包含不可中断等待:诊断方向容易被误导到 CPU 侧,延误 I/O 根因定位

数据来源与参考

  • Linux 内核 Documentation/filesystems/proc.rst
  • man 5 proc
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌