为什么 Node.js 的 os.loadavg() 一分钟负载值低于 1?
结论
os.loadavg() 的第一个值表示 Linux 的 1 分钟负载平均值。它不是最近 60 秒 CPU 使用率的简单平均,也不会在进程启动满 1 分钟时立刻变成 1。这个值经过指数平滑,新负载会逐渐影响结果。因此,如果负载起初约为 0.09,一个进程持续处于可运行状态 1 分钟后,读到约 0.68 是合理的。
为什么 1 分钟后约为 0.68
在 Linux 上,load average 统计处于可运行状态或不可中断睡眠状态的任务数量,并分别计算 1、5、15 分钟负载平均值。它表示任务数量,不是 CPU 使用率百分比,也不会按 CPU 核心数归一化。
Linux 大约每隔 5 秒更新这些值,并使用指数平滑。1 分钟负载从旧值逐渐接近新值的过程,可以用下面的近似式表示:
新负载 ≈ 目标负载 + (旧负载 - 目标负载) × e^(-经过时间 / 60 秒)
假设开始时负载约为 0.09,之后始终有一个可运行任务,目标负载就是 1。经过 60 秒:
1 + (0.09 - 1) × e^(-60 / 60) ≈ 0.67
这个结果接近观测到的 0.68。实际读数会受采样时机、初始负载和系统中其他任务影响。
“1 分钟”描述的是这个平均值响应变化的时间尺度。它不是只统计过去 60 秒的固定窗口,也不会在第 60 秒达到完整平均值。
16 个核心如何影响结果
一个持续运行的 CPU 密集型进程通常对应一个可运行任务。负载稳定后,load average 会趋近于 1。机器有 16 个核心,不会让这个值变成 1/16,因为负载值表示任务数量,而不是单核或整机的使用率百分比。
如果有 16 个同类任务持续处于可运行状态,负载平均值可能趋近于 16。这不表示电脑必然崩溃。判断系统是否拥塞,还要结合 CPU 核心数、其他任务和实际响应情况。
代码读取的是什么
const os = require('os');
console.log(os.loadavg());
在 WSL 的 Linux 环境中,os.loadavg() 返回系统提供的 1、5、15 分钟负载平均值。因此,数组第一个元素反映平滑后的系统负载,不是 loadTest.js 单独占用的 CPU 百分比。
要观察该进程的 CPU 使用率,可以使用进程监控工具。判断系统负载是否过高时,则应同时考虑 load average、可用 CPU 核心数和其他运行任务。
备注:内容仅供参考。
