Netflixのパフォーマンスエンジニアも使っているsarコマンドについてまとめた


https://twitter.com/go_vargo/status/1215281798948642817?s=20

上記Tweetで紹介されていた内で、`sar`コマンドに馴染みがなかったので少し調査してみました。

## sarコマンドとは

sar(System Activity Reporter)はLinuxのモニタリングツールの1つです。

メモリ、CPU使用率、ディスクIO、ネットワーク、ロードアベレージ等の統計情報を表示するコマンドで、sysstatパッケージに含まれています。

リアルタイムの統計情報だけでなく、過去の統計情報を表示することが可能で、
過去にさかのぼって情報を見ることができるため、障害対応時の原因調査に役立ちます。

表示する統計情報の種類は、オプションで指定します。

## 基本的な使い方

### オプション

```
sar [...options]
```

[...options]に、どのリソースの情報を表示するか指定します。


オプションを指定しない場合、当日のリソース情報が取得されます。
情報取得間隔は、デフォルトは10分です。

### 過去データの保存先

Amazon Linux 2だと、`/var/log/sa` 配下に過去データが保存されていきます。

```bash
[ec2-user@xxx ~]$ ls -la  /var/log/sa
合計 2652
drwxr-xr-x 2 root root    167  5月 24 05:14 .
drwxr-xr-x 8 root root   4096  5月 24 05:14 ..
-rw-r--r-- 1 root root  91760 10月 12  2019 sa12
-rw-r--r-- 1 root root 336992 10月 13  2019 sa13
-rw-r--r-- 1 root root 336992 10月 14  2019 sa14
-rw-r--r-- 1 root root 238880 10月 15  2019 sa15
-rw-r--r-- 1 root root 290320 10月 17  2019 sa17
-rw-r--r-- 1 root root 336992 10月 18  2019 sa18
-rw-r--r-- 1 root root  16960 10月 19  2019 sa19
-rw-r--r-- 1 root root   5328  5月 24 05:30 sa24
-rw-r--r-- 1 root root  68488 10月 12  2019 sar12
-rw-r--r-- 1 root root 249044 10月 13  2019 sar13
-rw-r--r-- 1 root root 249044 10月 14  2019 sar14
-rw-r--r-- 1 root root 214675 10月 17  2019 sar17
-rw-r--r-- 1 root root 249044 10月 18  2019 sar18
```

`sar**`のあとの数字は、直近何日分かを表しています。

ファイル自体はバイナリで保存されていますが、
sar経由でファイルの中身を表示できます。

```bash
[ec2-user@xxx ~]$ sar -r -f /var/log/sa/sa12
Linux 4.14.123-111.109.amzn2.x86_64 (localhost) 	2019年10月12日 	_x86_64_	(1 CPU)

17時23分29秒       LINUX RESTART

17時30分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
17時40分01秒    493536    513796     51.01      2088    390136    593996     58.97    166828    253464       252
17時50分01秒    493540    513792     51.01      2088    390300    593996     58.97    166892    253532       252
18時00分01秒    493004    514328     51.06      2088    390636    593988     58.97    167000    253844       216
```

### リアルタイムの情報を、特定間隔に絞って表示する場合

コマンドのあと`[取得間隔] [取得回数]`でリアルタイムで表示するデータを制限できます。

1秒おきに3回情報を習得する場合は、下記の通りです。

```bash
[ec2-user@xxx ~]$ sar -r 1 3
Linux 4.14.146-119.123.amzn2.x86_64	2020年05月24日 	_x86_64_	(1 CPU)

05時37分41秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
05時37分42秒    585824    421468     41.84      2088    323892    531260     52.74    154588    198628       128
05時37分43秒    584948    422344     41.93      2088    323892    531260     52.74    155608    198628       128
05時37分44秒    584568    422724     41.97      2088    323892    531260     52.74    155884    198628       128
平均値:     585113    422179     41.91      2088    323892    531260     52.74    155360    198628       128
```

### 統計情報を別ファイルに保存する

```
## memというファイルにメモリのリアルタイム情報を1秒間隔で3回保存する
[ec2-user@xxx ~]$ sar -r 1 3 -o mem

## memファイルに保存した統計情報を表示する
[ec2-user@xxx ~]$ sar -r -f mem
```

### 表示するリソースを指定する

オプションを変えることで、表示するリソースを指定できる

- CPU使用率

```bash
[ec2-user@xxx ~]$ sar -P ALL 1
Linux 4.14.146-119.123.amzn2.x86_64 	2020年05月24日 	_x86_64_	(1 CPU)

05時39分43秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
05時39分44秒     all      0.00      0.00      0.00      0.00      0.00    100.00
05時39分44秒       0      0.00      0.00      0.00      0.00      0.00    100.00

```


- メモリ使用率

```
[ec2-user@xxx ~]$ sar -r 1
Linux 4.14.146-119.123.amzn2.x86_64 	2020年05月24日 	_x86_64_	(1 CPU)

05時41分24秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
05時41分25秒    586180    421112     41.81      2088    323940    526944     52.31    154808    198444         0
05時41分26秒    586180    421112     41.81      2088    323940    526944     52.31    154808    198444         0
05時41分27秒    586180    421112     41.81      2088    323940    526944     52.31    154808    198444         0

```


- ネットワーク


```bash:受信/送信パケット数
[ec2-user@xxx ~]$ sar -n DEV 1
Linux 4.14.146-119.123.amzn2.x86_64 (ip-172-31-63-105.ap-northeast-1.compute.internal) 	2020年05月24日 	_x86_64_	(1 CPU)

05時42分33秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
05時42分34秒      eth0      2.00      0.00      0.10      0.00      0.00      0.00      0.00
05時42分34秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05時42分34秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
05時42分35秒      eth0      1.01      1.01      0.05      0.39      0.00      0.00      0.00
05時42分35秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
```