uptime的三个负载值(1/5/15分钟)能提示波动是否刚发生或持续存在,结合vmstat、pidstat、systemctl list-timers及/proc/interrupts等命令可定位五分钟内剧烈波动的具体原因。

直接看 uptime 输出的三个负载值(1/5/15分钟)本身不能定位剧烈波动原因,但它能快速提示你“是否发生了波动”以及“波动是刚发生还是持续存在”。真正分析五分钟内剧烈波动,要结合 uptime 的数值趋势,再用配套命令验证假设。
先从 uptime 数值读出波动特征
运行 uptime,关注这组输出:
15:22:03 up 83 days, 23 min, 1 user, load average: 2.10, 8.45, 6.32
这里 1 分钟负载(2.10)远低于 5 分钟负载(8.45),说明过去一分钟负载明显回落;而 5 分钟又高于 15 分钟(6.32),说明五分钟前那段时间负载更高。整体呈现“先冲高、后回落”的波动形态。
这种差值大于 2 倍且方向明确的情况,基本可排除随机抖动,需重点排查以下几类原因:
- 刚结束的定时任务(如每分钟执行一次的 cron 脚本、监控采集、日志轮转)
- 短生命周期服务突发启动/退出(例如健康检查脚本反复拉起又退出)
- 某类高频唤醒行为突然停止(如 Java 应用 GC 风暴、Netty 线程忙轮询)
- 网络或磁盘中断风暴在最近几十秒内平息(比如网卡收包洪峰过去)
用 vmstat 和 pidstat 快速验证进程级波动
uptime 提示波动发生在五分钟内,那就用秒级采样工具抓实时行为:
运行 vmstat 1 60(持续 60 秒),重点关注三列:
- r:就绪队列长度。若某几秒 r 值突然跳到 CPU 核数的 2 倍以上,说明大量进程争抢 CPU
- cs:每秒上下文切换次数。持续高于 10000 表明调度压力大,常见于大量线程或短命进程
- b:不可中断睡眠进程数。若某几秒 b 值飙升(如 >5),大概率是 I/O 卡顿引发 D 状态堆积
再配合 pidstat -w 1,观察是否有进程的 nvcswch/s(非自愿上下文切换)在波动期间猛增——这往往是锁竞争、频繁唤醒或忙等待的信号。
检查定时任务和系统服务触发点
五分钟内的剧烈波动,时间上高度吻合周期性任务。执行以下命令排查:
-
systemctl list-timers --all:查看所有启用的 timer,注意那些精度为分钟级的(如logrotate.timer、motd-news.timer) -
crontab -l && sudo crontab -l:检查用户和 root 的 cron,特别留意* * * * *或*/1 * * * *这类每分钟执行项 -
grep -r "sleep.*0\." /etc/cron* /etc/systemd/system/ 2>/dev/null:搜可能存在的反模式写法,比如while true; do ...; sleep 0.5
如果发现某定时任务刚好在波动时间点前后执行,可用 journalctl --since "2 minutes ago" | grep -i "taskname" 查看其实际运行日志和耗时。
关联中断与软中断变化
若波动伴随 CPU 使用率忽高忽低但 us 不高,%si(软中断)却异常,很可能是中断驱动的抖动。执行:
-
cat /proc/interrupts | awk '{print $1,$2,$3,$4}' | head -20:对比两次输出,看eth0、nvme、timer对应行计数是否在波动期间猛增 -
cat /proc/softirqs:重点看NET_RX和TIMER列,若某次采样比前一次增长数千,说明网络收包或内核定时器活动剧烈 - 临时关闭 NIC offload 测试:
ethtool -K eth0 gro off gso off tso off,观察波动是否减弱
不复杂但容易忽略的是:很多波动不是程序写得差,而是硬件交互节奏没调好。uptime 是起点,不是终点。











