uptime的三个数字(1/5/15分钟平均负载)反映系统运行队列与不可中断睡眠进程的加权平均值,其中1分钟值敏感易抖动,5分钟值最稳宜判持续压力,15分钟值平滑滞后;需结合CPU核心数及vmstat的r/b值综合分析,不可单凭数值高低定论瓶颈。

怎么看 uptime 输出的三个数字在波动
uptime 显示的 load average: 1.23, 0.98, 0.76 不是实时采样值,而是指数衰减加权平均 —— 1 分钟值响应快、抖动大;5 分钟值最稳,适合判断是否持续承压;15 分钟值平滑但滞后明显。不能拿 1 分钟值直接和 CPU 核数比对,它可能只是刚跑完一个 find / -name "*.log" 导致的瞬时尖峰。
常见误判场景:
- 看到
load average: 8.4, 2.1, 1.3就断定“CPU 爆了”,其实可能是 8 个进程卡在磁盘 I/O(D 状态),wa在top里高达 90%,而%Cpu(s): 5.2us, 2.1sy, 1.3wa, 91.4id - 15 分钟负载
0.05很低,但 1 分钟突然跳到4.2,说明刚有突发任务进来,未必代表系统已失衡
用 vmstat 看清负载背后的真实排队行为
vmstat 1 每秒刷新一次,比 uptime 多出两个关键列:r(就绪态进程数)和 b(不可中断态 D 状态进程数)。这两个数加起来,才接近当前时刻真实的“排队长度”。
实操建议:
- 运行
vmstat 1 5观察连续 5 秒的r和b:若r长期 > CPU 逻辑核数(可用nproc查),说明 CPU 确实饱和;若b显著 > 0(比如稳定在 3~5),大概率是磁盘或 NFS 卡住,不是 CPU 问题 -
r + b值 ≈/proc/loadavg第一列(1 分钟负载)的瞬时映射,但更及时 ——/proc/loadavg是内核后台定时更新,有延迟 - 注意
wa列:如果它持续 > 20%,即使load average只有 2.0,也说明 I/O 是瓶颈,不是 CPU
脚本化采集负载趋势时别只读 /proc/loadavg
自动化监控中常写 cat /proc/loadavg | awk '{print }' 抓 1 分钟负载,但这会漏掉关键上下文。/proc/loadavg 的第四字段(如 2/124)才是当前真实就绪+阻塞进程数,斜杠前是 r + b 的快照值。
推荐做法:
- 用
awk '{print $1, $4}' /proc/loadavg同时拿到平均负载和瞬时队列长度,例如输出0.45 2/124,其中2是此刻等待资源的进程总数 - 避免用
uptime做脚本解析:它的输出格式受 locale 影响(比如中文系统里 “up” 变成 “已运行”),/proc/loadavg是稳定二进制接口,无格式风险 - 若需长期趋势,配合
date +%s打点写入日志,不要依赖top -b -n1—— 它默认等待 3 秒刷新,会拖慢采集频率
容器环境里 load average 显示不一致怎么办
在 Docker 或 Kubernetes Pod 里执行 uptime,看到的仍是宿主机的负载;但 top 在容器内可能因 cgroup 限制显示被“压缩”的值,造成困惑。
验证方法:
- 进容器执行
cat /proc/loadavg,对比宿主机同命令输出:若数值不同,说明容器 runtime 对/proc做了虚拟化(如 LXCFS),此时容器内看到的是“受限视图”,不能直接反映宿主机压力 - 查容器实际 CPU 配额:运行
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us和/sys/fs/cgroup/cpu/cpu.cfs_period_us,算出可用 CPU 时间比例,再结合容器内top的%CPU判断是否真饱和 - 真正可靠的指标是宿主机上的
vmstat或pidstat -r -u 1,它们绕过容器抽象层,直读内核调度器原始数据
平均负载的陷阱在于它把 CPU 就绪、I/O 阻塞、锁竞争全混成一个数。盯住 r 和 b 的分离值,比死磕那三个斜杠分隔的浮点数有用得多。


















