单靠一次 uptime 命令无法判断负载趋势,必须定时采集带时间戳的负载值并结合 cpu 逻辑核数分析;需用 date+uptime 组合写入 csv 日志,再用 gnuplot 绘制三线趋势图,同时关注 d 状态进程等非 cpu 类瓶颈。

单靠一次 uptime 命令看不出趋势,必须定时采集带时间戳的负载值,并结合 CPU 核心数判断是否异常。
为什么不能只跑一次 uptime
终端敲一次 uptime 只拿到当前快照,比如 load average: 2.15, 1.89, 1.72——这三个数本身不说明问题:它们可能刚冲高回落,也可能正加速爬升。真正关键的是变化方向和持续时长。如果 1 分钟值(2.15)远高于 5/15 分钟值,但你没历史数据,就无法判断这是瞬时毛刺还是雪崩前兆。
用 date + uptime 定时写入 CSV 日志
最轻量、无依赖的方式是组合 shell 命令写入结构化日志:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
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 过载
负载高 ≠ CPU 忙:大量 D 状态进程(磁盘等待)也会拉高负载,但 top 显示 CPU 使用率可能很低。此时:
-
wa%持续 > 5%,iostat -x 1会暴露%util接近 100% 或await异常升高 - 执行
ps aux | awk '$8 ~ /D/ { print }'列出所有D状态进程,常见于 NFS 挂载超时、坏盘响应、内核模块死锁 - 别直接 kill
D进程——它不可中断,kill 无效,只会卡在defunct状态,得查dmesg日志定位底层硬件或驱动问题
真正难处理的不是数值本身,而是 D 状态进程的不可见性:它不占 CPU,却堵住调度队列,且无法被常规信号终止。










