# sar 工具

`sar` 命令是 Linux 下系统运行状态统计工具，它将指定的操作系统状态计数器显示到标准输出设备。

`sar` 工具将对系统当前的状态进行取样，然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样，获得大量的取样数据。取样数据和分析的结果都可以存入文件，使用它时消耗的系统资源很小。

## 命令用法

```bash
$ sar [ options ] [ <interval> [ <count> ] ]
```

和 `vmstat` 以及 `iostat` 类似，`interval` 代表状态信息刷新的时间间隔， `count` 代表显示报告的次数。

## 常用可选参数

* `-A` —— 等同于指定 `-bBdqrRSuvwWy -I SUM -I XALL -n ALL -u ALL -P ALL`
* `-b` —— 显示 I/O 以及传输速率的统计信息。其取值如下所示：
  * `tps` 每秒发送给物理设备的总的传输量（指发送给物理设备的 I/O 请求）。多个逻辑请求会合并为单独的一个 I/O 请求，因此，传输量的大小是不确定的。
  * `rtps` 每秒发送给物理设备的总的读取请求。
  * `wtps` 每秒发送给物理设备的总的写入请求。
  * `bread/s` 每秒钟以块形式从设备读取的数据的多少。在 2.4 以上版本的内核钟，这个块大小等于扇区大小，因此为 512 字节。在以前的版本，这个大小是不确定的。
  * `bwrtn/s` 每秒钟以块形式往设备写入的数据的多少。
* `-B` —— 报告页统计信息。以下的一些值只有在 2.5 内核版本前才可用：
  * `pgpgin/s` 每秒从磁盘中置换出来的页的大小，以千字节的形式显示（2.2 版本前这个值表示块数量）
  * `pgpgout/s` 每秒写入磁盘的页的大小，以千字节的形式显示（2.2 版本前这个值表示块数量）
  * `fault/s` 每秒由系统产生的 page fault （包括 minor 和 major）的数量
  * `majflt/s` 每秒由系统产生的 major page fault 的数量，这些都是需要从磁盘中加载一份内存页的。
  * `pgfree/s` 每秒钟系统释放的内存页的数目
  * `pgscank/s` 每秒由 kwsapd 守护进程扫描到的内存页数目
  * `pgscand/s` 每秒直接扫描的内存页的数目
  * `pgsteal/s` 每秒系统根据内存开销需要从缓存中取回的内存页的数目
  * `%vmeff` 计算 `pgsteal`/`pgscan` ，得到页置换效率的矩阵图。
* `-C` —— 当从文件中读取数据时，告诉 `sar` 来展示通过 `sadc` 插入的注释
* `-d` —— 报告每个块设备的活动信息（只在 2.4 版本以上内核可用）
* `-e [ hh:mm:ss ]` —— 设置报告的结束时间。默认的结束时间是 18:00:00 。小时必须以 24 小时制的形式。这个选项可以用在读写文件中（使用 `-f` 或 `-o`）
* `-f [filename]` 从 `filename` 中提取记录，默认值是当前日志数据文件 `/var/log/sa/sadd` 文件。和 `-o` 不可以同时使用。
* `-i interval` —— 在尽可能接近 `interval` 时间间隔里获取数据记录。
* `-n { keyword [,...] | ALL }` 报告网络统计信息。可选的 keyword 为 `DEV`, `EDEV`, `NFS`, `NFSD`, `SOCK`, `IP`, `EIP`, `ICMP`, `EICMP`, `TCP`, `ETCP`, `UDP`, `SOCK6`, `IP6`, `EIP6`, `ICMP6`, `EICMP6` 以及 `UDP6`.
* `-o [ filename ]` —— 以二进制格式保存 reading 到文件中。每个 reading 都是单独的记录。`filename` 的默认值是 `/var/log/sa/sadd` 文件。
* `-P { cpu [,...] | ALL }` —— 报告指定的处理器或所有处理器的统计信息。注意 processor 0 是第一个处理器
* `q` 报告队列长度以及平均负载信息。显示以下结果：
  * `runq-sz` 运行队列长度（等待运行的任务的数目）
  * `plist-sz` 任务列表中任务数量
  * `ldavg-l` 上一分钟系统的平均负载
  * `ldavg-5` 最近 5 分钟的系统平均负载
  * `ldavg-15` 最近 15 分钟的系统平均负载
* `-r` 报告内存的使用率的统计信息，显示以下结果：
  * `kbmemfree` 可用的空闲内存大小（千字节）
  * `kbmemused` 已使用内存大小（不包括内核本身使用）（千字节）
  * `%memused` 已使用内存百分比
  * `kbbuffers` 内核用来作为缓冲区的内存大小（千字节）
  * `kbcached` 内核用来缓存数据的内存大小（千字节）
  * `%commit` 当前工作载荷所需要的内存百分比（通常会超过 100%）
* `-R` —— 报告内存统计信息，显示以下结果：
  * `frmpg/s` 系统每秒释放的内存页数目，负值代表系统需要分配的页数目。一个页通常是 4KB 或 8KB（视机器架构而定）
  * `bufpg/s` 系统每秒需要用作缓冲区的额外内存页数目。
  * `campg/s` 系统每秒用作缓存的额外内存页数目
* `-s[ hh:mm:ss ]` —— 设置数据的起始时间，因为 `sar` 工具会从这个指定的时间点开始被触发并提取数据，默认是 08:00:00 。小时必须以 24 小时制的形式。这个选项可以用在读写文件中（使用 `-f` 或 `-o`）
* `-S` 报告 swap 空间的使用率统计情况
  * `kbswpfree` 空闲 swap 空间大小（千字节）
  * `kbswpused` 已用 swap 空间大小（千字节）
  * `%swpused` 已用 swap 空间百分比
  * `kbswpcad` 缓存的 swap 内存的数目（千字节）
  * `%swpcad` 缓存的 swap 内存占医用 swap 空间的百分比
* `-u [ ALL ]` —— 报告 CPU 的使用情况。
* `-v` 报告 inode 、 file 以及其他内核表的状况
* `-w` 报告任务创建以及系统切换的活动信息
* `-W` 报告交换区的统计信息
* `-y` 报告 TTY （终端）设备的活动信息

## 使用示例

1. 每 2 秒统计 CPU 的使用情况，显示 5 行：

   ```bash
    $ sar -u 2 5
   ```
2. 显示内存和网络的统计信息并保存到日志文件 `sal6` 中：

   ```bash
    $ sar -r -n DEV -f /var/log/sa/sal6
   ```
3. 显示当前日志文件中保存的全部统计信息：

   ```bash
    $ sar -A
   ```

## 已知 BUG

* `sar` 只有在 `/proc` 文件系统以被挂载的情况下才能使用。
* 不是所有的统计信息都可用，取决于所使用的内核版本

## 使用文件

* `/var/log/sa/sadd` 默认的日志数据文件，`dd` 表示的是这个月的第几天
* `/proc` 包含多个不同的系统统计文件


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://linux-in-action.gitbook.io/project/xing-neng-fen-xi/sar.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
