简介 | sar(System Activity Reporter,系统活动报告器)用于打印 CPU、内存、磁盘、网络和负载平均值,数据来源可以是实时计数器,也可以是 sysstat 在 /var/log/sysstat 下收集的历史文件。需要安装 sysstat 包并启用数据收集才能查看历史报告。 |
软件包 | sysstat (apt/deb) / sysstat (dnf/rpm) |
手册页 | sar(1) |
权限 | 普通用户(部分报告可能需要 root 权限) |
发行版 | 所有包含 sysstat 的发行版(Ubuntu、Debian、RHEL、Fedora、SUSE 等)。实时进程查看:top;块设备快照:iostat。 |
语法概要
用法:sar [ 选项 ] [ <间隔> [ <次数> ] ]
不带选项时,sar 打印自启动以来的平均 CPU 利用率。指定间隔和可选次数时,它采样实时计数器。使用 -f 或负日期偏移(-1)时,它读取 sadc 写入的二进制归档文件——通常在启用 sysstat 服务后位于 /var/log/sysstat 下。
命令示例
3.1 实时 CPU 采样(每 2 秒)
当你需要判断 CPU 峰值是持续的还是短暂时,使用较短的间隔——在繁忙主机上保持 1-5 秒的间隔。
运行命令:
sar -u 2 3
示例输出:
字段说明:
时间戳 | 采样时间,格式为 HH:MM:SS AM/PM |
CPU | 处理器标识,all 表示所有 CPU 的平均值 |
%user | 用户空间进程占用 CPU 的百分比 |
%nice | 用户进程优先级 |
%system | 内核空间进程占用 CPU 的百分比 |
%iowait | CPU 等待 I/O 操作完成的时间百分比 |
%steal | 虚拟机管理器占用 CPU 的时间百分比(虚拟化环境中) |
%idle | CPU 空闲时间的百分比 |
高 %system 且低 %idle 通常指向内核或系统调用密集型工作;可配合 sar -w 或 top 查看哪些进程导致。
3.2 内存和磁盘 I/O 联合排查
当主机感觉变慢时,在调整应用前先检查瓶颈是内存压力还是磁盘等待。
内存利用率:
sar -r 1 1
示例输出:
字段说明:
时间戳 | 采样时间 |
kbmemfree | 空闲物理内存大小,单位为 KB |
kbavail | 可用内存大小(包含缓存和缓冲区),单位为 KB |
kbmemused | 已使用的物理内存大小,单位为 KB |
%memused | 已使用物理内存的百分比 |
kbbuffers | 缓冲区缓存大小,单位为 KB |
kbcached | 页面缓存大小,单位为 KB |
kbcommit | 当前工作负载需要的内存量(含交换空间),单位为 KB |
%commit | 已提交内存占物理内存和交换空间总和的百分比 |
kbactive | 活跃内存大小(最近使用过的内存),单位为 KB |
kbinact | 非活跃内存大小(最近未使用的内存),单位为 KB |
kbdirty | 等待写回磁盘的脏页大小,单位为 KB |
I/O 速率:
sar -b 1 1
示例输出:
字段说明:
时间戳 | 采样时间 |
tps | 每秒传输次数(I/O 请求数) |
rtps | 每秒读请求数 |
wtps | 每秒写请求数 |
dtps | 每秒丢弃请求数 |
bread/s | 每秒读取的块数 |
bwrtn/s | 每秒写入的块数 |
bdscd/s | 每秒丢弃的块数 |
%commit 超过 100% 意味着可能存在交换或 OOM 风险;sar -u 中 bread/s 或 bwrtn/s 较高且 %iowait 升高表明存在存储瓶颈——详见 iostat 获取每设备详情。
3.3 块设备和网络接口
磁盘和网络报告可帮助你在故障期间区分存储延迟和网卡饱和。
块设备统计:
sar -d 1 1 | tail -5
每接口吞吐量:
sar -n DEV 1 1
示例输出:
字段说明:
时间戳 | 采样时间 |
IFACE | 网络接口名称 |
rxpck/s | 每秒接收的数据包数 |
txpck/s | 每秒发送的数据包数 |
rxkB/s | 每秒接收的千字节数 |
txkB/s | 每秒发送的千字节数 |
rxcmp/s | 每秒接收的压缩数据包数 |
txcmp/s | 每秒发送的压缩数据包数 |
rxmcst/s | 每秒接收的多播数据包数 |
%ifutil | 接口利用率百分比 |
物理网卡上 %ifutil 上升但应用吞吐量持平可能意味着链路或驱动限制——使用 sar -n EDEV 查看错误计数器。
3.4 读取历史数据 /var/log/sysstat
不带间隔的 sar 读取自启动以来的平均值。要查看全天趋势,读取 sadc 在启用 sysstat 收集时写入的二进制文件 sa1 … sa31(或 saYYYYMMDD)。
列出可用归档:
ls -l /var/log/sysstat/sa*
读取今天文件:
sar -f /var/log/sysstat/sa10 | head -10
示例输出:
字段说明:
时间戳 | 采样时间 |
CPU | 处理器标识,all 表示所有 CPU 的平均值 |
%user | 用户空间进程占用 CPU 的百分比 |
%nice | 用户进程优先级 |
%system | 内核空间进程占用 CPU 的百分比 |
%iowait | CPU 等待 I/O 操作完成的时间百分比 |
%steal | 虚拟机管理器占用 CPU 的时间百分比 |
%idle | CPU 空闲时间的百分比 |
如果 /var/log/sysstat 为空,启用收集:在 /etc/default/sysstat 中设置 ENABLED="true",然后运行 sudo systemctl restart sysstat。
3.5 使用 -P ALL 进行每 CPU 细分
多核主机上单个 CPU 过热在全局平均中只表现为小幅峰值——每 CPU 视图可让不均衡负载一目了然。
sar -P ALL 1 1
示例输出:
字段说明:
Average | 平均值标识 |
CPU | 处理器标识,all 为全局平均,0、1 等为具体 CPU 编号 |
%user | 用户空间进程占用 CPU 的百分比 |
%nice | 带有 nice 优先级的用户进程占用 CPU 的百分比 |
%system | 内核空间进程占用 CPU 的百分比 |
%iowait | CPU 等待 I/O 操作完成的时间百分比 |
%steal | 虚拟机管理器占用 CPU 的时间百分比 |
%idle | CPU 空闲时间的百分比 |
如需每 CPU 的 irq/softirq 列,可与 sar -u ALL 对比。
3.6 运行队列和负载平均值
负载平均值回答"有多少任务在等待 CPU 时间?"——当 %idle 看起来正常但延迟很高时很有用。
sar -q 1 1
示例输出:
字段说明:
时间戳 | 采样时间 |
runq-sz | 运行队列长度(等待 CPU 的进程数) |
plist-sz | 进程列表中的进程总数 |
ldavg-1 | 过去 1 分钟的平均负载 |
ldavg-5 | 过去 5 分钟的平均负载 |
ldavg-15 | 过去 15 分钟的平均负载 |
blocked | 当前被 I/O 阻塞的进程数 |
runq-sz 长期高于 CPU 数量且 ldavg-1 高通常意味着 CPU 饱和;blocked 高指向 I/O 等待——交叉检查 sar -b 和 sar -d。
3.7 使用 -h 显示人类可读百分比
脚本和仪表板有时需要在 CPU 列上显示百分号而无需后处理。
sar -h -u 1 1
示例输出:
字段说明:
时间戳 | 采样时间 |
CPU | 处理器标识,all 表示所有 CPU 的平均值 |
%user | 用户空间进程占用 CPU 的百分比 |
%nice | 用户进程优先级 |
%system | 内核空间进程占用 CPU 的百分比 |
%iowait | CPU 等待 I/O 操作完成的时间百分比 |
%steal | 虚拟机管理器占用 CPU 的时间百分比 |
%idle | CPU 空闲时间的百分比 |
-h 在 sysstat 12.7.5 中等同于 --pretty --human。
3.8 无归档文件 — 启用 sysstat 收集
新安装的系统通常已安装 sar 但无历史文件,直到启用 sysstat 收集。
检查服务是否激活:
systemctl is-active sysstat
cat /etc/default/sysstat | grep ENABLED
收集开启时的示例输出:
active ENABLED="true"
如果启用后 ls /var/log/sysstat 仍为空,等待 /etc/cron.d/sysstat 中的定时任务(默认每 10 分钟)或运行一次 sudo sa1 1 1 来生成文件,然后重试 sar -f /var/log/sysstat/sa$(date +%d)。
使用场景
使用 sar | 使用其他工具 |
- 需要从 /var/log/sysstat 查看 CPU、内存、磁盘或网络数小时或数天的趋势 - 想要可重复的间隔采样(sar -u 2 10)用于前后对比 - 已在使用 sysstat 套件,想要一个工具覆盖多种资源类别 - 需要从归档数据中查看每 CPU 或每接口的细分 | - 需要实时、可排序的进程列表 → top 或 ps - 想要当前每进程磁盘 I/O → iotop - 需要详细的每磁盘吞吐量和 util% 快照 → iostat - 想要即时内存和交换计数器而不需要归档 → vmstat - /var/log/sysstat 为空且无法启用 sysstat 收集 → 仅使用实时 sar INTERVAL |
sar vs iostat
两者都来自 sysstat 并读取内核计数器,但侧重点不同。
| sar | iostat |
主要关注点 | 多种资源类别;历史文件 | 每设备的磁盘 I/O 和 CPU |
历史数据 | 支持(-f, /var/log/sysstat) | 有限(主要是实时) |
每进程详情 | 无 | 无 |
最适合 | 日常趋势、混合 CPU/内存/磁盘/网络 | 存储瓶颈分析 |
详见 iostat 命令获取每设备的 %util 和 await 列。
常见问题
Q1: sar 命令在 Linux 中做什么?
sar(System Activity Reporter,系统活动报告器)是 sysstat 软件包的一部分。它读取内核活动计数器并打印 CPU、内存、磁盘、网络、负载等报告。
实践中两种模式很重要:
1.1. 实时模式 — sar -u 2 5 每 2 秒采样,共 5 次。
2.2. 历史模式 — sar -f /var/log/sysstat/sa01 回放 sysstat 收集时由 sadc 收集的数据。
更进一步:
"sar 从 sysstat 报告系统活动——可通过间隔/次数实时采样,或从 /var/log/sysstat 下的二进制归档读取。我用它来查看 CPU、内存、磁盘和网络随时间的趋势。"
Q2: 何时使用 sar 而不是 top?
top 显示当前哪些进程在使用 CPU 和内存。sar 汇总随时间的资源类别并可读取归档样本——更适合回答"上周二 14:00 磁盘 I/O 是否很高?"
交互式排查用 top;容量规划、事后时间线和跨重启证明模式(有归档时)用 sar。
更进一步:
"top 用于实时每进程视图;sar 用于间隔采样和历史 sysstat 文件,当我需要数小时或数天的趋势,而非仅当前进程列表时。"
Q3: sar 在 Ubuntu 上将历史数据存储在哪里?
在 Debian 和 Ubuntu 上,sadc 通常写入 /var/log/sysstat。文件名为 saDD 或 saYYYYMMDD。sysstat 服务必须启用(/etc/default/sysstat 中 ENABLED="true"),且 /etc/cron.d/sysstat 中的定时任务必须运行。
使用 sar -f /var/log/sysstat/sa01 读取,或 sar -1 查看昨天。
更进一步:
"在 /var/log/sysstat 下,以 saDD 或 saYYYYMMDD 二进制文件形式存在,由 sadc 在 sysstat 启用时填充——我用 sar -f 或 sar -1 读取昨天的数据。"
Q4: 如何用 sar 排查高 I/O 等待?
从 sar -u 开始——高 %iowait 意味着 CPU 空闲等待存储。然后运行 sar -b(聚合传输速率)和 sar -d(每块设备)。配合 iostat 获取每磁盘的 %util 和 await。
更进一步:
"我先在 sar -u 中检查 %iowait,然后用 sar -b 和 sar -d 查看传输和每设备活动,需要每磁盘 util% 和服务时间时再用 iostat。"
Q5: 如何在 Ubuntu 上安装 sar?
安装 sysstat 软件包——sar、iostat、mpstat 和 sadc 一起打包:
sudo apt install sysstat
在 /etc/default/sysstat 中启用收集,重启服务,确认 /var/log/sysstat 下出现文件。
更进一步:
"apt install sysstat——sar 不是单独包。我启用 ENABLED=true,重启 sysstat,并验证 /var/log/sysstat 下的 sa* 文件。"
常见使用问题解决
症状 | 可能原因 | 修复方法 |
Cannot open /var/log/sysstat/saXX: No such file | 收集未启用或文件尚未创建 | 在 /etc/default/sysstat 中设置 ENABLED="true";sudo systemctl restart sysstat;等待定时任务或运行 sudo sa1 1 1 |
sar: command not found | 未安装 sysstat | sudo apt install sysstat |
-m TEMP / -m FAN 输出为空或只有一行 | 虚拟机或硬件未暴露传感器 | 许多云虚拟机正常现象;省略这些报告或使用宿主机监控指标 |
标志报 Invalid option | sysstat 版本较旧 | 对照主机上的 sar --help 匹配标志(本页对应 sysstat 12.7.5) |
实时 sar 1 造成明显负载 | 小型实例上间隔过于激进 | 使用 2-10 秒间隔或读取归档文件 |
sar — 快速参考
8.1 CPU 和处理器
自启动以来的 CPU 利用率(默认报告) | sar |
CPU 利用率报告 | sar -u |
CPU 完整报告(含 irq、soft、guest 等) | sar -u ALL |
CPU 0 的每处理器统计 | sar -P 0 |
所有 CPU 的每处理器统计及全局平均 | sar -P ALL |
一次性运行所有活动报告(输出量很大) | sar -A |
8.2 内存、交换和分页
内存利用率 | sar -r |
内存完整报告 | sar -r ALL |
交换空间利用率 | sar -S |
分页统计 | sar -B |
内存交换(每秒换入/换出页数) | sar -W |
大页利用率 | sar -H |
8.3 磁盘和 I/O
I/O 和传输速率统计 | sar -b |
块设备活动 | sar -d |
在 -d 输出中省略空闲块设备 | sar -z -d |
文件系统空间统计 | sar -F |
单个挂载点的文件系统统计 | sar -F / |
8.4 网络
网络接口吞吐量(数据包和 kB/s) | sar -n DEV |
网络接口错误计数器 | sar -n EDEV |
NFS 客户端统计 | sar -n NFS |
NFS 服务端统计 | sar -n NFSD |
IPv4 套接字统计 | sar -n SOCK |
IPv4 IP 流量 | sar -n IP |
IPv4 IP 错误 | sar -n EIP |
IPv4 ICMP 流量 | sar -n ICMP |
IPv4 ICMP 错误 | sar -n EICMP |
IPv4 TCP 流量 | sar -n TCP |
IPv4 TCP 错误 | sar -n ETCP |
IPv4 UDP 流量 | sar -n UDP |
IPv6 套接字统计 | sar -n SOCK6 |
IPv6 IP 流量 | sar -n IP6 |
IPv6 IP 错误 | sar -n EIP6 |
IPv6 ICMP 流量 | sar -n ICMP6 |
IPv6 ICMP 错误 | sar -n EICMP6 |
IPv6 UDP 流量 | sar -n UDP6 |
光纤通道 HBA 统计 | sar -n FC |
所有网络关键字报告 | sar -n ALL |
8.5 负载、任务和内核表
运行队列长度和平均负载 | sar -q |
仅平均负载 | sar -q LOAD |
压力停滞 CPU 统计 | sar -q CPU |
压力停滞 I/O 统计 | sar -q IO |
压力停滞内存统计 | sar -q MEM |
所有负载和 PSI 关键字 | sar -q ALL |
任务创建和上下文切换 | sar -w |
inode、文件和内核表使用 | sar -v |
每秒中断总数 | sar -I SUM |
TTY 设备活动 | sar -y |
8.6 电源管理 (-m)
电池容量 | sar -m BAT |
CPU 瞬时时钟频率 | sar -m CPU |
风扇转速 | sar -m FAN |
CPU 平均时钟频率 | sar -m FREQ |
电压输入 | sar -m IN |
设备温度传感器 | sar -m TEMP |
USB 设备接入 | sar -m USB |
所有电源管理关键字 | sar -m ALL |
8.7 实时间隔和历史文件
每 N 秒采样一次,直到按 Ctrl+C | sar -u 2 |
每 N 秒采样 M 次后退出 | sar -u 2 5 |
读取已保存的数据文件(默认目录 /var/log/sysstat) | sar -f /var/log/sysstat/sa01 |
昨天的数据文件(相对日期偏移) | sar -1 |
两天前的数据 | sar -2 |
将实时采样保存为二进制文件 | sar -o /tmp/sar.out -u 2 3 |
读取归档文件时显示时间戳 | sar -t -f /var/log/sysstat/sa01 |
显示归档文件中嵌入的注释 | sar -C -f /var/log/sysstat/sa01 |
使用 -o 写入时采用 saYYYYMMDD 命名 | sar -D -o /var/log/sysstat/sa20260701 -u 2 3 |
读取归档时按开始时间过滤(HH:MM:SS) | sar -s 09:00:00 -e 12:00:00 -f /var/log/sysstat/sa01 |
8.8 输出过滤和格式
限制 -d 输出中的块设备 | sar --dev=sda -d |
限制 -F 输出中的文件系统 | sar --fs=/ -F |
限制 -n DEV 中的网络接口 | sar --iface=lo -n DEV |
限制 -I 输出中的中断号 | sar --int=1 -I SUM |
人类可读的百分比(-h 别名) | sar -h -u 1 1 |
美观打印输出 | sar --pretty -u 1 1 |
人类可读的单位 | sar --human -u 1 1 |
百分比小数位(0、1 或 2) | sar --dec=2 -u 1 1 |
显示最小/最大列(扩展报告) | sar -x -u 1 1 |
打印收集数据时使用的 sadc 命令行 | sar --sadc -f /var/log/sysstat/sa01 |
8.9 帮助和版本
简要用法(主要报告标志) | sar --help |
软件包版本 | sar -V |
相关工具