当系统出现间歇性卡顿、业务高峰期响应变慢,或者需要复盘昨天凌晨的性能瓶颈时,你往往无法实时盯着 top 或 vmstat。这时就需要一个能够持续在后台采集系统各项指标,并可按时间点回溯查询的工具。sar(System Activity Reporter)正是为此而生。它随 sysstat 软件包一起安装,是目前 Linux 上最标准、最全面的历史性能数据采集与报告工具之一。
1. 安装与启用自动采集
大多数 Linux 发行版都可以直接安装 sysstat:
# Debian/Ubuntu
sudo apt install sysstat
# RHEL/CentOS/Rocky
sudo dnf install sysstat # 或 yum install sysstat
安装后,需要启用数据收集。编辑配置文件 /etc/default/sysstat(Debian 系)或 /etc/sysconfig/sysstat(RHEL 系),将 ENABLED="false" 改为 ENABLED="true"。保存后重启服务:
sudo systemctl enable --now sysstat
系统会启动 sysstat 相关任务,默认每10分钟采集一次数据,并保存在 /var/log/sysstat/(或 /var/log/sa/)目录下,文件名为 sa 加日期(如 sa22 表示当月 22 号的数据)。历史文件通常会自动保留一段时间(默认7天,可由配置调整)。
2. 基本语法与读取历史数据
sar 的命令格式非常灵活,既可以查看当前实时信息,也可以回溯任意历史时刻:
sar [选项] [间隔秒数] [次数]
如果不指定时间间隔,sar 默认显示当日的 CPU 统计。若要查看某天的历史数据,使用 -f 指定二进制文件:
sar -f /var/log/sysstat/sa22
你也可以加上 -s 和 -e 参数限定起止时间,精确到小时分钟秒:
sar -s 09:00:00 -e 18:00:00 -f /var/log/sysstat/sa22
这非常利于分析特定时间段(如营业高峰)的系统行为。
3. 核心指标的查看方法
sar 按选项分类展示不同子系统,涵盖了 CPU、内存、磁盘 I/O、网络、进程、上下文切换等几乎所有维度。
CPU 性能(默认项)
sar -u # CPU 利用率:%user, %system, %iowait, %idle 等
sar -P ALL # 每个 CPU 核心的详细使用率
输出中的 %iowait 是判断磁盘 I/O 是否成为瓶颈的关键:如果该值持续偏高,说明 CPU 在等待磁盘,可进一步用 sar -d 定位具体设备。
内存与 swap
sar -r # 内存使用:kbmemfree, kbmemused, kbbuffers, kbcached 等
sar -S # swap 空间使用:kbswpfree, kbswpused 等
通过 kbcached 和 kbbuffers 的变化可以判断内存压力。如果 sar -S 显示 swap 使用量在持续增长,往往意味着物理内存不足。
磁盘 I/O
sar -b # 块设备 I/O 总览:tps, rtps, wtps, bread/s, bwrtn/s
sar -d # 每个块设备的详细 I/O:tps, rkB/s, wkB/s, await, %util
%util 接近 100% 且 await(平均 I/O 等待时间)很高时,表明磁盘已严重饱和。sar -d 可以精确定位是哪个磁盘或分区压力大。
网络
sar -n DEV # 各网络接口的收发统计:rxpck/s, txpck/s, rxkB/s, txkB/s
sar -n EDEV # 各网络接口的错误统计:rxerr/s, txerr/s, coll/s 等
-n DEV 能快速看出高峰时段的网络吞吐量是否达到了接口上限;-n EDEV 则能揪出网卡丢包、冲突等硬件层问题。
其他重要指标
sar -q # 系统负载和进程队列长度:runq-sz, plist-sz, ldavg-1/5/15
sar -w # 进程创建和上下文切换:proc/s, cswch/s
sar -n TCP # TCP 连接统计:active/s, passive/s, retrans/s
两者结合可以判断系统是否因进程过多或频繁上下文切换而变慢。retrans/s(TCP 重传率)过高则意味着网络质量存在问题。
4. 多维度组合输出
-A 选项可以一次性输出所有指标,但数据量庞大,通常不直接用于终端阅读,而是重定向到文件后用脚本分析:
sar -A -f /var/log/sysstat/sa22 > full_report.txt
对于常规诊断,更实用的做法是针对几个相关选项分别运行,例如在怀疑 IO 瓶颈时同时查看 -u、-b、-d。
5. 图形化与集成
虽然 sar 本身只提供命令行数字输出,但它的数据格式规范,适合被监控系统消费。如果你需要长期趋势图,可以将 sar 的输出导入 Prometheus + Grafana、Zabbix 等平台,或者使用 sadf(sysstat 的另一成员)将二进制文件转换为 JSON、XML 或 CSV 格式供 Web 前端展示:
sadf -j /var/log/sysstat/sa22 -- -u # 以 JSON 格式输出 CPU 历史数据
6. 实战:快速复盘昨天的性能瓶颈
假设业务反馈昨天下午 3 点到 4 点之间系统响应缓慢。只需一行命令就能拉出该时段所有 CPU 和磁盘 I/O 的详细记录:
sar -u -d -s 15:00:00 -e 16:00:00 -f /var/log/sysstat/sa$(date -d "yesterday" +%d)
输出中若看到 %iowait 飙高、某磁盘的 %util 接近 100%,基本可断定磁盘 I/O 是主因,再结合 -d 中的 await 大小判断是否需要更换为 SSD 或做读写分离。
总之,sar 是运维工程师排查历史遗留性能问题的首选利器。它轻量、无需额外架构,默认就会后台静默工作,在你需要的时候提供一整套可追溯的系统体检报告。养成定期检查 sar 日志的习惯,能让很多偶发问题在变得严重之前就暴露无遗。