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