单靠一次 uptime 命令无法判断负载趋势,必须定时采集带时间戳的负载值并结合 CPU 核心数分析;需用 shell 脚本写入 CSV 日志,再用 gnuplot 绘制三线趋势图,同时关注 D 状态进程与 I/O 等待指标。

单靠一次 uptime 命令看不出趋势,必须定时采集带时间戳的负载值,并结合核心数判断是否异常。
为什么不能只看一次 uptime 输出
终端敲一次 uptime 只能拿到当前快照,比如 load average: 2.15, 1.89, 1.72 —— 这三个数本身不说明问题:它们可能刚冲高回落,也可能正加速爬升。真正关键的是变化方向和持续时长。如果 1 分钟值(2.15)远高于 5/15 分钟值,但你没历史数据,就无法判断这是瞬时毛刺还是雪崩前兆。
用 date + uptime 定时写入 CSV 日志
最轻量、无依赖的方式是组合 shell 命令写入结构化日志:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
while true; do
echo "$(date '+%Y-%m-%d %H:%M:%S'),$(uptime | awk -F'load average:' '{print $2}' | sed 's/ //g')" >> /var/log/load-trend.csv
sleep 60
done
-
awk -F'load average:'比正则更稳,绕开不同发行版空格数量不一致的问题 -
sed 's/ //g'清掉所有空格,确保 CSV 字段对齐(如1.23,0.98,0.76而非1.23, 0.98, 0.76) -
sleep 60是合理下限;低于 30 秒采样意义不大,因 1 分钟负载本身就是指数衰减平均值 - 日志路径选
/var/log/而非/tmp,避免重启丢失
用 gnuplot 快速画出三线趋势图
不用装 Python 或 Grafana,几行命令就能生成可读折线图:
gnuplot -e "
set xdata time; set timefmt '%Y-%m-%d %H:%M:%S'; set format x '%H:%M';
set xlabel 'Time'; set ylabel 'Load Average';
plot '/var/log/load-trend.csv' using 1:2 with lines title '1-min', \
'' using 1:3 with lines title '5-min', \
'' using 1:4 with lines title '15-min'"
- 三条线叠加能一眼看出斜率差异:若
1-min线持续高于5-min线,说明压力在累积 - 图中纵轴数值必须结合 CPU 核心数解读——查核数用
grep -c 'model name' /proc/cpuinfo,不是物理核数,是逻辑核数(含超线程) - 若 15 分钟负载长期 > 核心数,才需深入排查;仅 1 分钟短暂冲高(如 8.2)而 5/15 分钟稳定在 1.2 左右,大概率是 cron 任务或部署动作,无需干预
容易被忽略的关键点
负载高 ≠ CPU 忙:大量 D 状态进程(磁盘等待)也会拉高负载,但 top 显示 CPU 使用率可能很低。此时 wa% 持续 >5%,iostat -x 1 会暴露 %util 接近 100% 或 await 异常升高。真正要盯的不是数字本身,而是“哪类状态在堆积”和“持续多久”。










