人人都会AI编程

20.6 综合工具:sar 全维度历史数据采集

更新时间:2026-07-12

当系统出现间歇性卡顿、业务高峰期响应变慢,或者需要复盘昨天凌晨的性能瓶颈时,你往往无法实时盯着 topvmstat。这时就需要一个能够持续在后台采集系统各项指标,并可按时间点回溯查询的工具。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 等

通过 kbcachedkbbuffers 的变化可以判断内存压力。如果 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 日志的习惯,能让很多偶发问题在变得严重之前就暴露无遗。