sar —— 事后回放系统历史

运维工具手册 01-系统监控与性能 4.3 KB 原文

sar —— 事后回放系统历史

分类:01 系统监控与性能 适用:Linux(sysstat),数据由 sa1/sa2 定时采集 一句话:唯一能回答"昨天下午三点系统什么样"的工具,故障复盘的核心。

1. 它解决什么问题

故障往往在你到场前就恢复了。top、vmstat 只能看当下,sar 读的是历史采样文件,可以随时回放 CPU、内存、IO、网络、负载。

2. 安装与开启采集

apt install -y sysstat
dnf install -y sysstat

# 开启采集(Ubuntu 安装后默认 disabled)
sed -i 's/^ENABLED=.*/ENABLED="true"/' /etc/default/sysstat   # Debian 系
systemctl enable --now sysstat

# RHEL 系由 cron 驱动
systemctl enable --now sysstat     # 提供 sysstat-collect.timer(新版)
# 老版本检查:
cat /etc/cron.d/sysstat            # 应有 */10 * * * * sa1 和 23:53 sa2

采集相关配置:

文件 作用
/etc/cron.d/sysstat 采集频率(默认每 10 分钟)与日报生成时间
/etc/sysconfig/sysstat RHEL:HISTORY=28 保留天数
/etc/default/sysstat Debian:ENABLED、HISTORY
/var/log/sa/saDD 二进制采样文件(DD 为日期)
/var/log/sa/sarDD sa2 生成的文本日报

采集间隔默认 10 分钟,对瞬时尖峰不敏感。要更细可用 sa1 1 60 临时手工采。

3. 核心用法

sar                # 今天从 00:00 到现在的全部 CPU 数据
sar 1 5            # 实时采样:每秒 1 次共 5 次(等同看当前)
sar -u 1 5         # 实时 CPU
sar -u -f /var/log/sa/sa15        # 回放 15 号的数据
sar -u -s 14:00:00 -e 15:00:00    # 指定时间区间(今天)
sar -u -f /var/log/sa/sa15 -s 14:00:00 -e 15:00:00

常用子项:

参数 内容 关键列
-u CPU %user %system %iowait %idle %steal
-q 负载与队列 runq-sz plist-sz ldavg-1/5/15
-r 内存 kbmemfree kbmemused %memused kbbuffers kbcached
-S swap kbswpfree kbswpused %swpused
-W 换页 pswpin/s pswpout/s
-b IO 总览 tps rtps wtps bread/s bwrtn/s
-d 块设备 tps rkB/s wkB/s await aqu-sz %util
-n DEV 网卡流量 rxkB/s txkB/s rxpck/s txpck/s
-n EDEV 网卡错误 rxerr/s txerr/s rxdrop/s txdrop/s
-n SOCK socket 使用 totsck tcpsck udpsck
-n TCP TCP 连接 active/s passive/s iseg/s oseg/s
-F 文件系统 MBfsfree MBfsused %fsused
-v inode/文件句柄 dentunusd file-nr inode-nr
-w 上下文切换 proc/s cswch/s
-m 电源 笔记本/部分服务器
-A 全部 输出很长

组合示例:

sar -u -r -q -b -n DEV -d -f /var/log/sa/sa15 -s 14:00:00 -e 16:00:00

4. 输出怎么读

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
02:10:01 PM     all      8.20      0.00     12.40     42.10      0.00     37.30
02:20:01 PM     all      6.10      0.00      9.80     61.30      0.00     22.80

%iowait 从 42% 涨到 61%,同时 %idle 下降 → 该时段磁盘压力骤增,再去 sar -d -f 看具体设备。

sar -d -f /var/log/sa/sa15 -s 14:00:00 -e 14:30:00
# 找 await 与 %util 异常的设备

负载与队列

sar -q -f /var/log/sa/sa15
# runq-sz > 核数 → 排队
# plist-sz 突然暴涨 → 进程泄漏(fork 炸弹、脚本失控)

网络异常

sar -n DEV -f /var/log/sa/sa15 -s 14:00:00
sar -n EDEV -f /var/log/sa/sa15 -s 14:00:00   # 有 rxdrop/txdrop 就是网卡或队列丢包

5. 实战场景

5.1 事故复盘标准动作

DAY=$(date -d yesterday +%d)
sar -u -q -r -b -n DEV -d -f /var/log/sa/sa$DAY > /tmp/review_cpu_io_net.txt
sar -n EDEV -f /var/log/sa/sa$DAY >> /tmp/review_cpu_io_net.txt

把 CPU、负载、内存、IO、网络放在一份报告里,对齐时间点,基本能还原事故曲线。

5.2 定位"每天固定时间变慢"

sar -q -f /var/log/sa/sa$(date +%d) | sort -k4 -nr | head
# 找 ldavg-15 最高的时段,再对该时段跑 sar -u / -d

5.3 判断是否需要扩容

连续看一周同一时段的 %idle 与 runq-sz:

for d in $(seq 1 7); do
  echo "== sa$d"; sar -q -f /var/log/sa/sa$d 2>/dev/null | awk '$4>4'
done

ldavg-15 持续超过核数 1.5 倍 → CPU 该扩了。

6. 常见坑

  1. 没开采集就啥也没有:Ubuntu 安装后默认 ENABLED="false",sar 会报 Cannot open /var/log/sa/saXX。
  2. 只保留 28 天:默认 HISTORY=28,超期文件被删,重要时段要提前备份。
  3. 文件按"日"命名,跨月需注意:sa01 是每月 1 号,会覆盖上月同一天,跨月复盘先拷贝。
  4. 第一次数据行是平均值:与 iostat 一样,解析时跳过。
  5. %iowait 在虚拟机上不准:vCPU 等待被计成 idle 或 steal,云主机要结合宿主机监控。
  6. -n DEV 显示的是所有网卡,容器环境会有大量 veth*,加 grep -v veth 过滤。
  7. sar -d 在 sysstat 12 里字段变了(areq-sz、aqu-sz),老脚本解析会错位。
  8. sar 默认读当天文件,不加 -f 时如果跨天会读错,明确写 -f。
  9. 采集本身有开销,超大规模机器可调低频率到 5 分钟。

7. 速查表

sar -u 1 5                      # 实时 CPU
sar -q                          # 今天负载
sar -r                          # 内存
sar -b                          # IO 总览
sar -d                          # 磁盘明细
sar -n DEV                      # 网卡
sar -n EDEV                     # 网卡错误
sar -F                          # 文件系统
sar -w                          # 上下文切换

sar -u -f /var/log/sa/sa15 -s 14:00:00 -e 15:00:00    # 回放指定时段
sar -A -f /var/log/sa/sa15 > /tmp/all.txt             # 全量导出

# 开启:systemctl enable --now sysstat
# 保留:/etc/sysconfig/sysstat 的 HISTORY=28