查历史性能数据的前提是sysstat服务已启用并持续采集,需确认systemctl状态、cron任务、日志文件存在;正确使用sar -f读取二进制日志,注意选项顺序和时间对齐,避开%iowait误判等常见陷阱。

要查历史性能数据,关键不是“怎么用 sar”,而是“数据有没有被存下来”。sar 本身不主动采集,它只负责读取 sysstat 服务写好的二进制日志。没存,就查不到;存了,查起来很直接。
确认 sysstat 是否在持续采集数据
这是第一步,也是最容易卡住的地方:
- 运行
systemctl is-active sysstat,返回active才算真正在跑 - 检查 cron 任务是否启用:
grep -v "^#" /etc/cron.d/sysstat | grep sa1,应有类似*/10 * * * * root /usr/lib/sa/sa1 -S DISK 1 1的行 - 查看昨天的日志是否存在:
ls -l /var/log/sa/sa$(date -d yesterday +%d)(比如今天是 7 月 29 日,就查sa28) - Ubuntu/Debian 默认常禁用该服务,需手动执行
sudo systemctl enable --now sysstat - 最小化系统或容器里可能根本没装 cron,sa1 就永远不会触发
正确读取历史数据的命令格式-f 是读历史的唯一入口,但它必须放在所有其他选项最前面,顺序错就失效:
- 查 7 月 28 日 CPU 使用率:
sar -f /var/log/sa/sa28 -u - 加细分项(如软中断):
sar -f /var/log/sa/sa28 -u ALL - 限定时间段(时间必须对齐默认 10 分钟采样点):
sar -f /var/log/sa/sa28 -u -s 10:00:00 -e 12:00:00 - 查磁盘 I/O 并显示真实设备名:
sar -d -p -f /var/log/sa/sa28 - 查内存使用:
sar -r -f /var/log/sa/sa28 - 查网络丢包(关键指标):
sar -n EDEV -f /var/log/sa/sa28
避开常见误读和陷阱
-
%iowait高 ≠ 磁盘慢:得同时看%idle,如果%idle也很高,才是真等 I/O;如果%idle很低,那可能是统计偏差或内核问题 -
%idle高但系统卡死?立刻执行ps aux | grep ' D ',找不可中断睡眠进程,大概率是存储无响应 - 单核饱和会被平均值掩盖:用
sar -P ALL -f /var/log/sa/sa28查各核独立负载 -
sar -u输出总和常超 100%,因为它是多核各自比例的叠加,真正有意义的忙时占比是100 - %idle - 日志被压缩(如
sa28.gz)?先解压再读:zcat /var/log/sa/sa28.gz | sar -u -f -
补充说明
- 数据默认存于
/var/log/sa/,文件名是saDD(DD 是当月日期),纯二进制,不能cat或vi - 默认每 10 分钟采一次,想改频率可编辑
/etc/cron.d/sysstat - 若提示
No such file or directory,八成是 cron 没跑成功,或/etc/default/sysstat中ENABLED="false"
不复杂但容易忽略。



















