sysstat（sarコマンド）でLinuxの性能測定メモ（CentOS7、CentOS8）

# はじめに
**sysstat**はLinux用サーバの負荷を分析するための監視ツールで、CPU負荷、ディスクI/O使用率、メモリ使用状況、ネットワークデバイス状況を調査することができる。

# 環境

+ 【CentOS7】
+ CentOS Linux release 7.8.2003
+ sysstat バージョン 10.1.5

```
[[root@CENTOS7 ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[root@CENTOS7 ~]# sar -V
sysstat バージョン 10.1.5
(C) Sebastien Godard (sysstat <at> orange.fr)
[root@CENTOS7 ~]#
```
&nbsp;
+ 【CentOS8】
+ CentOS Linux release 8.1.1911
+ sysstat バージョン 11.7.3

```
[root@centos8 ~]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@centos8 ~]# sar -V
sysstat バージョン 11.7.3
(C) Sebastien Godard (sysstat <at> orange.fr)
[root@centos8 ~]#
```

# 1. sysstatのインストール

```
yum install -y sysstat
```

# 2. 設定ファイルの場所

`sa1`コマンド、`sa2`コマンドの起動が、CentOS7ではcornで設定されているのに対し、CentOS8ではsystemdのtimerで設定されている。

### 2.1. CentOS7

CentOS7（sysstat バージョン 10.1.5）でのsysstatの設定ファイルは以下の2ファイル。

+ `/etc/cron.d/sysstat`
+ `/etc/sysconfig/sysstat`

```bash:/etc/cron.d/sysstat
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
```
10分単位に`sa1`コマンドでリソース情報を「/var/log/sa/sa`XX`」に保存
23時53分に`sa2`コマンドで保存した情報をレポート形式に整形して「/var/log/sa/sar`XX`」保存
※`XX`は日付
※cron設定を変更した場合、以下のコマンドで反映を有効にする。
```
systemctl restart crond
```
&nbsp;

```bash:/etc/sysconfig/sysstat
# sysstat-10.1.5 configuration file.

# How long to keep log files (in days).
# If value is greater than 28, then log files are kept in
# multiple directories, one for each month.
HISTORY=28

# Compress (using gzip or bzip2) sa and sar files older than (in days):
COMPRESSAFTER=31

# Parameters for the system activity data collector (see sadc manual page)
# which are used for the generation of log files.
SADC_OPTIONS="-S DISK"

# Compression program to use.
ZIP="bzip2"
```

### 2.2. CentOS8

CentOS8（sysstat バージョン 11.7.3）でのsysstatの設定ファイルは以下の6ファイル。

+ `/usr/lib/systemd/system/sysstat.service`
+ `/usr/lib/systemd/system/sysstat-collect.service`
+ `/usr/lib/systemd/system/sysstat-collect.timer`
+ `/usr/lib/systemd/system/sysstat-summary.service`
+ `/usr/lib/systemd/system/sysstat-summary.timer`
+ `/etc/sysconfig/sysstat`

```bash:/usr/lib/systemd/system/sysstat.service
# /usr/lib/systemd/system/sysstat.service
# (C) 2012 Peter Schiffer (pschiffe <at> redhat.com)
#
# sysstat-11.7.3 systemd unit file:
#        Insert a dummy record in current daily data file.
#        This indicates that the counters have restarted from 0.

[Unit]
Description=Resets System Activity Logs

[Service]
Type=oneshot
RemainAfterExit=yes
User=root
ExecStart=/usr/lib64/sa/sa1 --boot

[Install]
WantedBy=multi-user.target
Also=sysstat-collect.timer
Also=sysstat-summary.timer
```

&nbsp;

```bash:/usr/lib/systemd/system/sysstat-collect.service
# /usr/lib/systemd/system/sysstat-collect.service
# (C) 2014 Tomasz Torcz <tomek@pipebreaker.pl>
#
# sysstat-11.7.3 systemd unit file:
#        Collects system activity data
#        Activated by sysstat-collect.timer unit

[Unit]
Description=system activity accounting tool
Documentation=man:sa1(8)
After=sysstat.service

[Service]
Type=oneshot
User=root
ExecStart=/usr/lib64/sa/sa1 1 1
```

&nbsp;

```bash:/usr/lib/systemd/system/sysstat-collect.timer
# /usr/lib/systemd/system/sysstat-collect.timer
# (C) 2014 Tomasz Torcz <tomek@pipebreaker.pl>
#
# sysstat-11.7.3 systemd unit file:
#        Activates activity collector every 10 minutes

[Unit]
Description=Run system activity accounting tool every 10 minutes

[Timer]
OnCalendar=*:00/10

[Install]
WantedBy=sysstat.service
```
10分単位に`sa1`コマンドでリソース情報を「/var/log/sa/sa`XX`」に保存

&nbsp;

```bash:/usr/lib/systemd/system/sysstat-summary.service
# /usr/lib/systemd/system/sysstat-summary.service
# (C) 2014 Tomasz Torcz <tomek@pipebreaker.pl>
#
# sysstat-11.7.3 systemd unit file:
#        Generates daily summary of process accounting

[Unit]
Description=Generate a daily summary of process accounting
Documentation=man:sa2(8)
After=sysstat.service

[Service]
Type=oneshot
User=root
ExecStart=/usr/lib64/sa/sa2 -A
```

&nbsp;

```bash:/usr/lib/systemd/system/sysstat-summary.timer
# /usr/lib/systemd/system/sysstat-summary.timer
# (C) 2014 Tomasz Torcz <tomek@pipebreaker.pl>
#
# sysstat-11.7.3 systemd unit file:
#        Triggers daily summary generation.
#        Activates sysstat-summary.service

[Unit]
Description=Generate summary of yesterday's process accounting

[Timer]
OnCalendar=00:07:00

[Install]
WantedBy=sysstat.service
```
7時00分に`sa2`コマンドで保存した情報をレポート形式に整形して「/var/log/sa/sar`XX`」保存
※`XX`は日付
※systemdのtimer設定を変更した場合、以下のコマンドで反映を有効にする。

```
systemctl daemon-reload
```

&nbsp;

```bash:/etc/sysconfig/sysstat
# sysstat-11.7.3 configuration file.

# How long to keep log files (in days).
# If value is greater than 28, then use sadc's option -D to prevent older
# data files from being overwritten. See sadc(8) and sysstat(5) manual pages.
HISTORY=28

# Compress (using xz, gzip or bzip2) sa and sar files older than (in days):
COMPRESSAFTER=31

# Parameters for the system activity data collector (see sadc manual page)
# which are used for the generation of log files.
SADC_OPTIONS=" -S DISK"

# Directory where sa and sar files are saved. The directory must exist.
SA_DIR=/var/log/sa

# Compression program to use.
ZIP="xz"

# By default sa2 script generates yesterday's summary, since the cron job
# usually runs right after midnight. If you want sa2 to generate the summary
# of the same day (for example when cron job runs at 23:53) set this variable.
#YESTERDAY=no

# By default sa2 script generates reports files (the so called sarDD files).
# Set this variable to false to disable reports generation.
#REPORTS=false
```

# 3. ログファイルの場所
ログファイル（リソース情報）は`var/log/sa`配下に格納される。
「sa`XX`」ファイルは定期的に取得したリソース情報を保存したバイナリファイルで、「sar`XX`」は「sa`XX`」の情報を元に作成されたテキスト形式のファイルとなっている。
※`XX`は日付

```
[root@CENTOS7 ~]# ls /var/log/sa
sa19  sa20  sa21  sar19  sar20
[root@CENTOS7 ~]#
```

# 4. saファイルの閲覧（sarコマンド）
saファイルの閲覧、saファイルをテキストファイルに変換して保存をするには以下のコマンドを使用する。
`sar -A -f 【saファイル（バイナリ）】`
`sar -A -f 【saファイル（バイナリ）】 > 【出力ファイル】`
※`-A`は全ての情報を表す。以下の指定も可能。
|オプション|内容|
|:-------:|:---|
|-b|I/O と転送率の状況|
|-B|ページングの状態|
|-d|ブロックデバイスの状態|
|-q|Qキューの長さとロードアベレージの状態|
|-r|メモリ利用率の状態|
|-R|メモリの状況|
|-S|スワップ領域の利用状況|
|-u|CPU 利用の利用状況|
|-v|カーネルのテーブル状態|
|-w|タスクの作成とシステムスイッチの状態|
|-W|スワップの状態|

```bash:実行例
[root@CENTOS7 ~]# sar -A -f /var/log/sa/sa19 > /tmp/sar19.txt
[root@CENTOS7 ~]#
```

CentOS7（sysstat バージョン 10.1.5）の場合、KSar（「[ksar プロジェクト日本語トップページ - OSDN](https://ja.osdn.net/projects/ksar/ "ksar プロジェクト日本語トップページ - OSDN")」からダウンロード可能）を使用してグラフを閲覧することも可能。

その際には、以下のコマンドでファイルを出力する。
`env LANG=C sar -A -f 【saファイル（バイナリ）】 > 【出力ファイル】`

```:実行例
[root@CENTOS7 ~]# env LANG=C sar -A -f /var/log/sa/sa19 > /tmp/sar19_lang_c.txt
[root@CENTOS7 ~]#
```

# 5. saファイルをTSV形式で出力（sadfコマンド）
`sar`コマンドで閲覧、ファイル出力する場合、スペース区切りとなる。TSV形式で出力したい場合、`sadf`コマンドを使用する。

`sadf -T -p -- -A 【saファイル（バイナリ）】 > 【出力ファイル】`
+ `-T`：時刻をローカル時刻で出力する
+ `-p`：TSV形式で出力する
+ `--`：これ以降に`sar`コマンド用のオプションを渡せるようにする
+ `-A`：すべての情報を出力

```:実行例
[root@CENTOS7 ~]# sadf -T -p -- -A /var/log/sa/sa19 > /tmp/sadf19.txt
[root@CENTOS7 ~]#
```

`sadf`コマンドは、TSV形式以外にもオプションでJSON形式（`-j`）、xml形式（`-x`）で出力することができる。

また、CentOS8（sysstat バージョン 11.7.3）の場合。`-g`オプションでSVG形式でグラフで出力することができる。SVG形式のグラフはブラウザで参照可能。

`sadf -T -g -- -A 【saファイル（バイナリ）】 > 【出力ファイル（SVG形式）】`

```:実行例
[root@centos8 ~]# sadf -T -g -- -A /var/log/sa/sa19 > /tmp/sadf19.svg
[root@centos8 ~]#
```

「sadf19.svg」をブラウザで表示
![sadf19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/15553561-d2bf-660c-0471-5c4738d86834.png)


# 6. コマンドでログ取得

cronやsystemdのtimer設定以外にも、コマンドでsaファイルと同様にリソース情報を取得することができる。

`sar -o datafile interval count > /dev/null 2>&1 &`
+ interval：間隔（秒）
+ count：回数

1秒間隔で全リソース情報を取得する場合、以下のコマンドを実行する。
`sar -o /tmp/sa.out 1 > /dev/null 2>&1 &`

```:実行結果
[root@centos8 ~]# sar -o /tmp/sa.out 1 > /dev/null 2>&1 &
[1] 2619
[root@centos8 ~]#
```

リソース情報を取得後、ジョブを終了する。
```:実行結果
[root@centos8 ~]# jobs
[1]+  実行中               sar -o /tmp/sa.out 1 > /dev/null 2>&1 &
[root@centos8 ~]# kill %1
[root@centos8 ~]#
```

通常のsaファイルと同様、`sar`コマンドや`sdaf`コマンドで閲覧、ファイル出力することができる。

```:実行結果
[root@centos8 ~]# sar -A -f /tmp/sa.out > /tmp/sar.txt
[root@centos8 ~]# env LANG=C  sar -A -f /tmp/sa.out > /tmp/sar_lang_c.txt
[root@centos8 ~]# sadf -T -p -- -A /tmp/sa.out > /tmp/sadf19.txt
[root@centos8 ~]# sadf -T -g -- -A /tmp/sa.out > /tmp/sadf19.svg
[root@centos8 ~]#
```

# 参考
+ [sysstat (sar) の RHEL8 での変更点や設定方法などのトピック | SIOS Tech. Lab](https://tech-lab.sios.jp/archives/18604 "sysstat (sar) の RHEL8 での変更点や設定方法などのトピック | SIOS Tech. Lab")
+ [CentOS 6 サーバーのリソース状態を sysstat で監視しよう](https://weblabo.oscasierra.net/centos6-sysstat-1/ "CentOS 6 サーバーのリソース状態を sysstat で監視しよう")
+ [kSarでsysstat(sar)をグラフ化したのはいいのだが、読めないので解読してみる](https://japanrock-pg.hatenablog.com/entry/20090415/1239795768 "kSarでsysstat(sar)をグラフ化したのはいいのだが、読めないので解読してみる")
+ [sar で収集したリソース使用情報が sadf コマンドで TSV として出力できる](https://miyakawataku.hatenablog.com/entry/20140202/1391330618 "sar で収集したリソース使用情報が sadf コマンドで TSV として出力できる")

　
---

以上