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 ...
列の意味はそれぞれ次の通りです。
- ホスト名。例: minx。
- データ収集時間(秒)。例: 5。
- 日付・時刻。例: 2014-02-02 08:23:20。
- リソース/デバイス。例: all。
- データの種類。例: %usr。
- 測定値。例: 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 に読み込んで、グラフを描きます。
同じことは kSar でも実現できますが、 sadf が嬉しいのは、バッチに組み込めることです。 sadf → gnuplot とかで、グラフ出力まで自動化できるはずです。