sar で収集したリソース使用情報が sadf コマンドで TSV として出力できる

sar が出力するテキストファイルは、機械可読性が低いため、リソース使用情報のレポートを作る際などに、難渋していました。 kSar というサードパーティのツールを使ってグラフを描いたり、 CSV を出力したりできるのですが、いちいち GUI ツールを立ち上げるのが手間です。

で、毎度ブーブー文句を言っていたのですが、ついこないだ、 sysstat に sadf というコマンドが付属していることを知りました。こいつは、 sar のバイナリデータを、 TSV や XML など、機械可読性の高い形式で出力してくれます。欲しかったのはこれだ!

sar とは: リソース使用情報を収集するツール

sar とは、リソース使用情報を収集する Linux 用のツールで、 sysstat というパッケージの一部として配布されています。
取れる情報は、CPU使用率、ディスクIO、NICごとのデータ転送量など、リソース使用情報一般です。

vmstat や iostat の仲間ですが、これらと異なり、いったんバイナリファイルに収集したデータを、後からテキストで出力する、という使い方をします。

また多くの場合、 sysstat をインストールすると、5分ごとのリソース使用情報が /var/log/sa に出力されるようになっています。

sar でリソース使用情報を収集する (sar -o <バイナリファイル>)

sar でバイナリファイルを出力するには、こんなコマンドを実行します。

$ sar -A -o sar.out 5 10 >/dev/null
-A
すべての情報を収集。
-o sar.out
バイナリファイルのパス。
5
5秒ごとにリソース使用情報を収集。
10
10回リソース使用情報を収集。省略すると、 Ctrl+C で殺すまで収集し続けます。
>/dev/null
5秒ごとにドカーとテキストが出てうっとおしいので消します。

このバイナリデータを sar や sadf でテキストに変換します。

sar でテキストデータを出力する (sar -f <バイナリファイル>)

sar を使ってバイナリデータをテキストとして出力するには、こんなコマンドを実行します。

$ env LANG=C sar -A -f sar.out >sar.txt
env LANG=C
扱いやすいように英語で出力する。 kSar に食わせる場合は必須です。
-A
すべての情報を出力
-f sar.out
バイナリファイルのパス。
>sar.txt
テキストファイル出力先。

出力結果はこんな感じ。各レコードに日付が入っていなかったり、セクションが空行で区切られていたり、機械で処理するのはかなり辛い感じです。

ありがたいことに、 kSar というツールで、このテキストファイルを読み込んで、グラフを描いたり CSV を出力したりできます。

sadf でテキストデータを出力する

sadf を使うと、 sar のバイナリファイルを、 TSV(デフォルト), CSV, XML など、機械可読性の高い形式で出力できます。こんなコマンドを実行します。

$ sadf -T -- -A sar.out >sadf.txt
-T
時刻をローカル時刻で出力する。
--
これ以降に、 sar コマンド用のオプションが渡せる。
-A
sar コマンド用のオプションと同じ。すべての情報を出力。
sar.out
バイナリファイルのパス。
>sadf.txt
TSV 出力先。

出力結果はこんな感じです。

minx	5	2014-02-02 08:23:20	all	%usr	0.90
minx	5	2014-02-02 08:23:20	all	%nice	0.00
minx	5	2014-02-02 08:23:20	all	%sys	1.49
minx	5	2014-02-02 08:23:20	all	%iowait	0.30
minx	5	2014-02-02 08:23:20	all	%steal	0.00
minx	5	2014-02-02 08:23:20	all	%irq	0.00
minx	5	2014-02-02 08:23:20	all	%soft	0.00
minx	5	2014-02-02 08:23:20	all	%guest	0.60
minx	5	2014-02-02 08:23:20	all	%gnice	0.00
minx	5	2014-02-02 08:23:20	all	%idle	96.72
minx	5	2014-02-02 08:23:20	cpu0	%usr	2.81
minx	5	2014-02-02 08:23:20	cpu0	%nice	0.00
...

列の意味はそれぞれ次の通りです。

  1. ホスト名。例: minx。
  2. データ収集時間(秒)。例: 5。
  3. 日付・時刻。例: 2014-02-02 08:23:20。
  4. リソース/デバイス。例: all。
  5. データの種類。例: %usr。
  6. 測定値。例: 0.90。

ここまで来たら、あとは何とでも料理できます。

sadf の出力を Excel でグラフにする

たとえば、こんな awk スクリプトで全CPUコアの使用率 (user, system, iowait) を抽出します。

BEGIN {
    FS = OFS = "\t"
    # Excel で読み込めるように、行末を CR+LF にする
    ORS = "\r\n"
    print "date_time", "%usr", "%sys", "%iowait"
}

function print_record() {
    print last_date_time, metric["%usr"], metric["%sys"], metric["%iowait"]
}

NR != 1 && last_date_time != $3 {
    print_record()
}

$4 == "all" && $5 ~ /%(usr|sys|iowait)/ {
    last_date_time = $3
    metric[$5] = $6
}

END {
    print_record()
}

抽出結果。

date_time	%usr	%sys	%iowait
2014-02-02 08:23:20	0.90	1.49	0.30
2014-02-02 08:23:25	0.99	0.89	0.00
2014-02-02 08:23:30	0.91	0.75	0.35
2014-02-02 08:23:35	1.06	0.70	0.20
2014-02-02 08:23:40	1.11	0.66	3.38
2014-02-02 08:23:45	1.01	1.47	1.97
2014-02-02 08:23:50	1.37	2.63	31.87
...

こいつを Excel に読み込んで、グラフを描きます。

http://d.hatena.ne.jp/miyakawa_taku/files/sadf.png?d=.png

同じことは kSar でも実現できますが、 sadf が嬉しいのは、バッチに組み込めることです。 sadf → gnuplot とかで、グラフ出力まで自動化できるはずです。