Linux sar 指令
sar
(System Activity Reporter,系统活动报告)是 Linux 系统中用于监控和分析系统性能的强大工具,属于 sysstat
软件包的一部分。它可以实时或历史性地收集、报告和保存系统的性能数据,涵盖 CPU、内存、磁盘 I/O、网络、进程等多个方面的指标。对于系统管理员和性能分析师来说,sar
是一个不可或缺的工具,能够帮助诊断性能瓶颈、优化资源分配以及进行容量规划。
一、sar 简介
1.1 什么是 sar?
sar
是 sysstat
工具集中的核心组件,用于收集和报告系统资源的使用情况。它通过定期采样系统活动数据(如 CPU 使用率、内存占用、磁盘 I/O、网络流量等),生成详细的性能报告。sar
的数据可以实时显示,也可以存储在日志文件中供后续分析。
sar
的主要功能包括:
- 实时监控系统性能。
- 历史数据分析(通过日志文件)。
- 提供多种性能指标,如 CPU、内存、磁盘、网络、进程等。
- 支持自定义时间间隔和输出格式。
- 可与其他工具(如
sadf
)结合,生成图形化报告。
1.2 sysstat 软件包
sar
是 sysstat
软件包的一部分,sysstat
还包括其他工具,如:
iostat
:报告 CPU 和 I/O 统计信息。mpstat
:报告多处理器统计信息。pidstat
:监控单个进程的资源使用情况。sadf
:将sar
数据转换为其他格式(如 CSV、XML)。
要使用 sar
,必须先安装 sysstat
软件包。
二、安装和配置 sar
2.1 安装 sysstat
在大多数 Linux 发行版中,可以通过包管理器安装 sysstat
。以下是常见发行版的安装命令:
-
Ubuntu/Debian:
sudo apt update sudo apt install sysstat
-
CentOS/RHEL:
sudo yum install sysstat # 或者使用 dnf sudo dnf install sysstat
-
Arch Linux:
sudo pacman -S sysstat
安装完成后,sysstat
会自动配置一个定时任务(通常通过 cron
),定期收集系统数据并存储在 /var/log/sysstat/
或 /var/log/sa/
目录下,文件名为 saDD
(DD 表示日期,如 sa30
表示 30 号的数据)。
2.2 配置 sysstat
sysstat
的配置文件通常位于 /etc/sysstat/sysstat
或 /etc/sysstat/sysstat.sysconfig
。主要配置项包括:
- ENABLED:是否启用
sysstat
数据收集(默认值为true
)。 - HISTORY:保留历史数据的天数(默认 28 天)。
- COMPRESSAFTER:数据文件压缩的天数。
- SADC_OPTIONS:传递给
sadc
(系统活动数据收集器)的参数。
示例配置文件 /etc/sysstat/sysstat
:
# 是否启用 sysstat
ENABLED="true"
# 保留 30 天历史数据
HISTORY=30
# 10 天后压缩数据
COMPRESSAFTER=10
# sadc 选项
SADC_OPTIONS="-S DISK"
2.3 验证安装
安装完成后,运行以下命令验证 sar
是否正常工作:
sar -u 1 3
这将每秒显示一次 CPU 使用率,共显示 3 次。如果输出类似以下内容,说明 sar
已正确安装:
Linux 5.15.0-73-generic (hostname) 2025年04月30日 _x86_64_ (4 CPU)
12:00:01 CPU %user %nice %system %iowait %steal %idle
12:00:02 all 5.23 0.00 2.15 0.00 0.00 92.62
12:00:03 all 4.87 0.00 2.03 0.00 0.00 93.10
12:00:04 all 5.10 0.00 2.20 0.00 0.00 92.70
Average: all 5.07 0.00 2.13 0.00 0.00 92.80
三、sar 的基本用法
sar
的基本语法如下:
sar [options] [interval [count]]
- options:指定要监控的性能指标(如
-u
表示 CPU 使用率)。 - interval:采样间隔时间(秒)。
- count:采样次数。
如果不指定 interval
和 count
,sar
会显示当天的历史数据(从 /var/log/sa/
读取)。
3.1 常用选项
以下是 sar
的常用选项及其含义:
选项 | 说明 |
---|---|
-u | 显示 CPU 使用率(默认选项)。 |
-r | 显示内存使用情况。 |
-b | 显示 I/O 和传输速率统计信息。 |
-d | 显示每个块设备的活动情况。 |
-n | 显示网络统计信息。 |
-q | 显示运行队列和负载平均值。 |
-P | 显示指定 CPU 的统计信息(例如 -P 0 表示第一个 CPU)。 |
-o | 将输出保存到文件。 |
-f | 从指定文件读取历史数据。 |
-s | 指定开始时间(格式 hh:mm:ss )。 |
-e | 指定结束时间(格式 hh:mm:ss )。 |
3.2 基本示例
以下是一些基本的 sar
命令示例:
-
实时监控 CPU 使用率:
sar -u 1 5
每秒显示一次 CPU 使用率,共 5 次。
-
查看当天的 CPU 使用率历史数据:
sar -u
显示当天从午夜开始的 CPU 使用率数据。
-
查看特定时间段的内存使用情况:
sar -r -s 08:00:00 -e 12:00:00
显示上午 8 点到中午 12 点的内存使用情况。
-
监控特定 CPU 的使用率:
sar -P 0 1 3
监控第一个 CPU(CPU 0)的使用率,每秒采样一次,共 3 次。
-
保存输出到文件:
sar -u -o /tmp/sar_output.bin 1 10
将 CPU 使用率数据保存到
/tmp/sar_output.bin
,每秒采样一次,共 10 次。 -
从文件读取数据:
sar -u -f /tmp/sar_output.bin
从指定文件中读取并显示 CPU 使用率数据。
四、sar 输出解读
sar
的输出内容根据选项不同而变化,下面以几个常用选项的输出为例,详细解读其含义。
4.1 CPU 使用率(-u)
命令:
sar -u 1 3
输出:
12:00:01 CPU %user %nice %system %iowait %steal %idle
12:00:02 all 5.23 0.00 2.15 0.00 0.00 92.62
12:00:03 all 4.87 0.00 2.03 0.00 0.00 93.10
12:00:04 all 5.10 0.00 2.20 0.00 0.00 92.70
Average: all 5.07 0.00 2.13 0.00 0.00 92.80
字段含义:
- %user:用户态进程的 CPU 使用率。
- %nice:低优先级用户态进程(通过
nice
设置)的 CPU 使用率。 - %system:内核态(系统调用、中断处理等)的 CPU 使用率。
- %iowait:CPU 等待 I/O 操作完成的时间百分比。
- %steal:虚拟化环境中,虚拟机被宿主机抢占 CPU 的时间百分比。
- %idle:CPU 空闲时间百分比。
分析:
- 如果
%user
或%nice
较高,说明用户进程(如 Web 服务器、数据库)占用了大量 CPU。 - 如果
%system
较高,可能是有大量系统调用或中断。 - 如果
%iowait
较高,说明磁盘 I/O 是瓶颈。 - 如果
%idle
较低(接近 0),说明 CPU 资源紧张。
4.2 内存使用情况(-r)
命令:
sar -r 1 3
输出:
12:00:01 kbmemfree kbavail kbbuffers kbcached kbcommit %commit
12:00:02 123456 234567 34567 456789 567890 12.34
12:00:03 124567 235678 34678 457890 568901 12.45
12:00:04 125678 236789 34789 458901 569012 12.56
Average: 124567 235678 34678 457890 568901 12.45
字段含义:
- kbmemfree:空闲内存(KB)。
- kbavail:可用内存(包括空闲内存和可回收的缓冲区/缓存)。
- kbbuffers:用于文件缓冲区的内存。
- kbcached:用于页面缓存的内存。
- kbcommit:已提交的内存(包括分配但未使用的内存)。
- %commit:已提交内存占总内存的百分比。
分析:
- 如果
kbmemfree
接近 0,但kbavail
较高,说明内存被用作缓存,这是正常现象。 - 如果
kbavail
较低,可能需要增加物理内存或优化应用程序。 - 如果
%commit
接近 100%,说明内存分配过多,可能导致交换分区使用。
4.3 磁盘 I/O(-b)
命令:
sar -b 1 3
输出:
12:00:01 tps rtps wtps bread/s bwrtn/s
12:00:02 10.23 5.12 5.11 123.45 234.56
12:00:03 11.34 6.23 5.11 134.56 245.67
12:00:04 12.45 7.34 5.11 145.67 256.78
Average: 11.34 6.23 5.11 134.56 245.67
字段含义:
- tps:每秒传输次数(I/O 操作次数)。
- rtps:每秒读请求次数。
- wtps:每秒写请求次数。
- bread/s:每秒读取的块数。
- bwrtn/s:每秒写入的块数。
分析:
- 如果
tps
较高且伴随高%iowait
(通过-u
查看),说明磁盘 I/O 是性能瓶颈。 - 高
bread/s
或bwrtn/s
表示大量数据读写,可能需要优化数据库查询或使用更快的存储设备。
五、高级用法
sar
不仅适用于实时监控,还可以通过高级用法实现更复杂的性能分析场景。以下是几种高级用法及其示例。
5.1 结合 sadf 导出数据
sadf
是 sysstat
的辅助工具,可以将 sar
的二进制数据转换为其他格式(如 CSV、XML、JSON),便于进一步分析或可视化。
示例:将 CPU 使用率数据导出为 CSV
sadf -d /var/log/sysstat/sa30 -- -u > cpu_usage.csv
输出文件 cpu_usage.csv
内容如下:
hostname;interval;timestamp;CPU;%user;%nice;%system;%iowait;%steal;%idle
server1;3600;2025-04-30 00:00:01;all;5.23;0.00;2.15;0.00;0.00;92.62
server1;3600;2025-04-30 01:00:01;all;4.87;0.00;2.03;0.00;0.00;93.10
...
可以用 Excel、Python 或其他工具分析此 CSV 文件。
Python 分析示例:
import pandas as pd
import matplotlib.pyplot as plt
# 读取 CSV 文件
data = pd.read_csv('cpu_usage.csv', sep=';')
# 转换时间戳
data['timestamp'] = pd.to_datetime(data['timestamp'])
# 绘制 CPU 使用率图
plt.figure(figsize=(10, 6))
plt.plot(data['timestamp'], data['%user'], label='%user')
plt.plot(data['timestamp'], data['%system'], label='%system')
plt.plot(data['timestamp'], data['%iowait'], label='%iowait')
plt.xlabel('Time')
plt.ylabel('Percentage')
plt.title('CPU Usage Over Time')
plt.legend()
plt.grid(True)
plt.savefig('cpu_usage.png')
5.2 自动化性能监控脚本
通过 shell 脚本和 sar
,可以实现自动化性能监控,并发送警报。
示例:监控 CPU 使用率并发送邮件警报
#!/bin/bash
THRESHOLD=80
SAR_OUTPUT=$(sar -u 1 1 | tail -n 1)
USER_USAGE=$(echo $SAR_OUTPUT | awk '{print $3}')
if (( $(echo "$USER_USAGE > $THRESHOLD" | bc -l) )); then
echo "CPU usage ($USER_USAGE%) exceeds threshold ($THRESHOLD%)" | mail -s "CPU Alert" admin@example.com
fi
将此脚本添加到 cron
任务中,每分钟运行:
* * * * * /path/to/monitor.sh
5.3 分析特定设备的性能
通过 -d
选项,可以监控特定磁盘设备的 I/O 性能。
示例:监控 /dev/sda
的 I/O
sar -d -p 1 3
输出:
12:00:01 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
12:00:02 sda 10.23 123.45 234.56 34.56 0.12 11.23 2.34 23.45
12:00:03 sda 11.34 134.56 245.67 34.67 0.13 11.34 2.45 24.56
12:00:04 sda 12.45 145.67 256.78 34.78 0.14 11.45 2.56 25.67
字段含义:
- tps:每秒传输次数。
- rd_sec/s:每秒读取的扇区数。
- wr_sec/s:每秒写入的扇区数。
- avgrq-sz:平均请求大小(扇区)。
- avgqu-sz:平均队列长度。
- await:平均请求等待时间(毫秒)。
- svctm:平均服务时间(毫秒)。
- %util:设备利用率。
分析:
- 如果
%util
接近 100%,说明磁盘已饱和。 - 如果
await
远大于svctm
,说明 I/O 请求排队时间长。
5.4 网络性能分析
通过 -n
选项,可以监控网络接口的流量和错误。
示例:监控所有网络接口的流量
sar -n DEV 1 3
输出:
12:00:01 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
12:00:02 eth0 123.45 234.56 456.78 567.89 0.00 0.00 12.34
12:00:03 eth0 134.56 245.67 467.89 578.90 0.00 0.00 13.45
12:00:04 eth0 145.67 256.78 478.90 589.01 0.00 0.00 14.56
字段含义:
- rxpck/s:每秒接收的数据包数。
- txpck/s:每秒发送的数据包数。
- rxkB/s:每秒接收的千字节数。
- txkB/s:每秒发送的千字节数。
- rxcmp/s:每秒接收的压缩数据包数。
- txcmp/s:每秒发送的压缩数据包数。
- rxmcst/s:每秒接收的多播数据包数。
分析:
- 高
rxkB/s
或txkB/s
可能表示网络流量较大。 - 如果
rxcmp/s
或txcmp/s
非零,说明使用了数据压缩。
六、实际案例分析
以下通过两个实际案例,展示如何使用 sar
诊断系统性能问题。
案例 1:高 CPU 使用率问题
背景:一台 Web 服务器响应缓慢,怀疑是 CPU 瓶颈。
步骤:
-
检查 CPU 使用率:
sar -u 1 10
输出显示
%user
持续在 90% 以上,%idle
接近 0。 -
定位高 CPU 进程:
使用pidstat
(sysstat
工具之一):pidstat -u 1 3
输出显示一个 Apache 进程(
httpd
)占用大量 CPU。 -
分析 Apache 日志:
检查/var/log/apache2/access.log
,发现大量爬虫请求导致负载激增。 -
解决方案:
- 配置
robots.txt
限制爬虫。 - 使用
mod_evasive
限制单个 IP 的请求频率。
- 配置
-
验证效果:
再次运行sar -u 1 10
,确认%user
降至 30% 左右,%idle
恢复正常。
案例 2:数据库 I/O 瓶颈
背景:数据库服务器查询延迟高,怀疑是磁盘 I/O 问题。
步骤:
-
检查 CPU 和 I/O:
sar -u 1 10 sar -b 1 10
输出显示
%iowait
较高(约 20%),tps
和bread/s
较高。 -
检查磁盘设备:
sar -d -p 1 10
输出显示
/dev/sdb
(数据库数据盘)的%util
接近 90%,await
远大于svctm
。 -
分析数据库性能:
使用mysqladmin status
和SHOW ENGINE INNODB STATUS
检查数据库,发现大量表扫描操作。 -
解决方案:
- 优化数据库索引,减少全表扫描。
- 将热点表迁移到 SSD 存储。
-
验证效果:
再次运行sar -d -p 1 10
,确认/dev/sdb
的%util
降至 50% 以下,查询延迟显著降低。
七、注意事项和最佳实践
-
数据收集频率:
默认情况下,sysstat
每 10 分钟收集一次数据(通过cron
)。如果需要更高频率(如每分钟),修改/etc/cron.d/sysstat
中的定时任务,但注意这会增加磁盘空间占用。 -
历史数据管理:
定期清理旧的saDD
文件,避免/var/log/sysstat/
占满磁盘。可以通过HISTORY
配置项控制保留时间。 -
性能影响:
sar
本身的资源消耗很低,但如果采样频率过高(例如每秒采样),可能对系统性能产生轻微影响。 -
结合其他工具:
sar
适合宏观性能分析,结合top
、htop
、vmstat
或perf
可以更深入地诊断问题。 -
日志文件损坏:
如果saDD
文件损坏,可能导致sar
无法读取历史数据。此时可以删除损坏文件并重建。
八、总结
sar
是 Linux 系统中功能强大的性能监控工具,能够提供 CPU、内存、磁盘 I/O、网络等多方面的详细统计信息。通过合理使用 sar
的各种选项和高级功能,系统管理员可以快速定位性能瓶颈、优化资源使用并确保系统稳定运行。