Linux sar 指令

Linux sar 指令

sar(System Activity Reporter,系统活动报告)是 Linux 系统中用于监控和分析系统性能的强大工具,属于 sysstat 软件包的一部分。它可以实时或历史性地收集、报告和保存系统的性能数据,涵盖 CPU、内存、磁盘 I/O、网络、进程等多个方面的指标。对于系统管理员和性能分析师来说,sar 是一个不可或缺的工具,能够帮助诊断性能瓶颈、优化资源分配以及进行容量规划。


一、sar 简介

1.1 什么是 sar?

sarsysstat 工具集中的核心组件,用于收集和报告系统资源的使用情况。它通过定期采样系统活动数据(如 CPU 使用率、内存占用、磁盘 I/O、网络流量等),生成详细的性能报告。sar 的数据可以实时显示,也可以存储在日志文件中供后续分析。

sar 的主要功能包括:

  • 实时监控系统性能。
  • 历史数据分析(通过日志文件)。
  • 提供多种性能指标,如 CPU、内存、磁盘、网络、进程等。
  • 支持自定义时间间隔和输出格式。
  • 可与其他工具(如 sadf)结合,生成图形化报告。

1.2 sysstat 软件包

sarsysstat 软件包的一部分,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:采样次数。

如果不指定 intervalcountsar 会显示当天的历史数据(从 /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 命令示例:

  1. 实时监控 CPU 使用率

    sar -u 1 5
    

    每秒显示一次 CPU 使用率,共 5 次。

  2. 查看当天的 CPU 使用率历史数据

    sar -u
    

    显示当天从午夜开始的 CPU 使用率数据。

  3. 查看特定时间段的内存使用情况

    sar -r -s 08:00:00 -e 12:00:00
    

    显示上午 8 点到中午 12 点的内存使用情况。

  4. 监控特定 CPU 的使用率

    sar -P 0 1 3
    

    监控第一个 CPU(CPU 0)的使用率,每秒采样一次,共 3 次。

  5. 保存输出到文件

    sar -u -o /tmp/sar_output.bin 1 10
    

    将 CPU 使用率数据保存到 /tmp/sar_output.bin,每秒采样一次,共 10 次。

  6. 从文件读取数据

    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/sbwrtn/s 表示大量数据读写,可能需要优化数据库查询或使用更快的存储设备。

五、高级用法

sar 不仅适用于实时监控,还可以通过高级用法实现更复杂的性能分析场景。以下是几种高级用法及其示例。

5.1 结合 sadf 导出数据

sadfsysstat 的辅助工具,可以将 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/stxkB/s 可能表示网络流量较大。
  • 如果 rxcmp/stxcmp/s 非零,说明使用了数据压缩。

六、实际案例分析

以下通过两个实际案例,展示如何使用 sar 诊断系统性能问题。

案例 1:高 CPU 使用率问题

背景:一台 Web 服务器响应缓慢,怀疑是 CPU 瓶颈。

步骤

  1. 检查 CPU 使用率

    sar -u 1 10
    

    输出显示 %user 持续在 90% 以上,%idle 接近 0。

  2. 定位高 CPU 进程
    使用 pidstatsysstat 工具之一):

    pidstat -u 1 3
    

    输出显示一个 Apache 进程(httpd)占用大量 CPU。

  3. 分析 Apache 日志
    检查 /var/log/apache2/access.log,发现大量爬虫请求导致负载激增。

  4. 解决方案

    • 配置 robots.txt 限制爬虫。
    • 使用 mod_evasive 限制单个 IP 的请求频率。
  5. 验证效果
    再次运行 sar -u 1 10,确认 %user 降至 30% 左右,%idle 恢复正常。

案例 2:数据库 I/O 瓶颈

背景:数据库服务器查询延迟高,怀疑是磁盘 I/O 问题。

步骤

  1. 检查 CPU 和 I/O

    sar -u 1 10
    sar -b 1 10
    

    输出显示 %iowait 较高(约 20%),tpsbread/s 较高。

  2. 检查磁盘设备

    sar -d -p 1 10
    

    输出显示 /dev/sdb(数据库数据盘)的 %util 接近 90%,await 远大于 svctm

  3. 分析数据库性能
    使用 mysqladmin statusSHOW ENGINE INNODB STATUS 检查数据库,发现大量表扫描操作。

  4. 解决方案

    • 优化数据库索引,减少全表扫描。
    • 将热点表迁移到 SSD 存储。
  5. 验证效果
    再次运行 sar -d -p 1 10,确认 /dev/sdb%util 降至 50% 以下,查询延迟显著降低。


七、注意事项和最佳实践

  1. 数据收集频率
    默认情况下,sysstat 每 10 分钟收集一次数据(通过 cron)。如果需要更高频率(如每分钟),修改 /etc/cron.d/sysstat 中的定时任务,但注意这会增加磁盘空间占用。

  2. 历史数据管理
    定期清理旧的 saDD 文件,避免 /var/log/sysstat/ 占满磁盘。可以通过 HISTORY 配置项控制保留时间。

  3. 性能影响
    sar 本身的资源消耗很低,但如果采样频率过高(例如每秒采样),可能对系统性能产生轻微影响。

  4. 结合其他工具
    sar 适合宏观性能分析,结合 tophtopvmstatperf 可以更深入地诊断问题。

  5. 日志文件损坏
    如果 saDD 文件损坏,可能导致 sar 无法读取历史数据。此时可以删除损坏文件并重建。


八、总结

sar 是 Linux 系统中功能强大的性能监控工具,能够提供 CPU、内存、磁盘 I/O、网络等多方面的详细统计信息。通过合理使用 sar 的各种选项和高级功能,系统管理员可以快速定位性能瓶颈、优化资源使用并确保系统稳定运行。

更多技术分享,关注公众号:halugin