sar コマンドで情報を収集して、gnuplotでグラフ化する(2017-03-14)
リソースの使用状況を見るコマンドに
iostat や vmstat、top など色々ありますが、
「とりあえず拾っておく」ならば「sar -o ファイル名 間隔秒」で拾っておくと
比較的広い範囲の情報を集められるので便利です。
それを時系列でグラフ化して比較や分析を容易にしよう、というのが今回の目標です。
グラフ化については「gnuplotでグラフ化」をご覧ください。
Excelマクロは、私は苦手なんですが・・・「マクロで取り込む例」
監視ソフトを入れれば良いのに†
返す言葉もございません。
shellで事足りる、あるいはshellでやりたい人向けに。
もう少し真面目な事情も書くと、
これが商用やら間借りやらのサーバだと自由に追加パッケージを入れるわけにもいかないので、
OS標準のコマンドでどこまでできるかがキモになります。*1
その際に万が一 sysstatが入っていなければお手上げなので、そこは事前に確認しておきましょう。
sarでログを定期的に収集†
sarコマンドが無い場合は、まずは sysstat を installする必要があります。
私のCentOS 7環境では既にsysstatは入っていて、sa1が動いていました。
# yum info sysstat
(なければ入れる)
# yum install sysstat
例として、こんな感じでシステムのログがとられています。
# view /etc/cron.d/sysstat
*/10 * * * * root /usr/lib64/sa/sa1 1 1
「man sa1」にあるように、/var/log/sa にファイルが落ちてました。
上記だと10分おきに拾っているのですが、
もう少し細かい粒度で拾ってもいいかもしれません。
というのは、平たんでつまらないからです
瞬間的にアクセスが集中したり、特定のプロセスが悪さしていたりした場合には
10分や1時間の平均値で見ても検出できないからです。
cronで回したい場合の例:
# mkdir /var/log/my_salog
(必要に応じて chmod と chown もやる)
# crontab -e
(※見づらいから改行しましたが、本当は一行で書く)
0 * * * * \rm -f /var/log/my_salog/salog`date +\%H`
&& sar -o /var/log/my_salog/salog`date +\%H` 4 900
>/dev/null 2>&1 &
sar で 4秒ごと900回のログをため込んでいます。
標準出力、エラー出力は /dev/null へリダイレクトして、 バックグラウンド(&)実行です。
sar -o は追加書き込みなので一旦 rm *2していますが、
sarlog`date +%d%H%M%S` のようにファイル名に日付(%d)や時分秒(%H%M%S)もいれて、
find /var/log/my_salog/ -name "salog*" -mtime 1 -exec \rm {} \;
のように24時間前分は削る方法など、よしなに。
sar で何を見るか?†
「sar -o ファイル名 収集間隔」で情報さえ拾っておけば
「sar -f ファイル名 [なにかオプション] 」で後で見ることができます。
では sar で何を見るかですが、
とりあえず好みで4つメモします。
- CPU使用率(-u)
まずは使用率全体をつかむ目的で、
(100 - %idle) を見てみる。
そのあとに user(各アプリが使っている率)や sys(システムが使っている率)など
個別に分析することになるのかと。
- メモリ使用状況(-r)
Linux では 使用率 memused はシステムが確保している分も含むので
(常に90%越えとか)高止まりしていることが多いです。
単純に枯渇状況が知りたいのならば、
最近であれば available(MemAvailable) という項目が追加されているかもしれません。
free コマンドや /proc/meminfo から確認できます。
- ロードアベレージ(-q)
実行待ちプロセス数で、CPUの数よりは小さい数値が良い。
CPUがプロセスをさばけているかはこの数値が参考になりますが、
性能要件(SLAとか)や監視閾値ってCPU使用率(-u)を定義することが多い気がします。
- 通信状況(-n DEVなど)
外と通信しているならば、前述の各リソースと並べて確認すると良い。
通信が瞬間的に跳ね上がって、瞬間的にシステムが処理しきれなくなる、
などのいわゆる「最繁時(とか、バーストとか、スパイクとか)」の情報を拾うならば、
やはり数秒周期での sar 取得データが必要になります。
負荷が高いことが判明したならば、
使用したポートの数(アプリで設定したスレッド数を超えないとか)
通信のドロップ数(許容量を超えて溢れてしまった数とか)
など、次に取得するべき情報が変わってくると思います。
いずれにせよ、とりあえず sar で拾っておけば後で探せる可能性があります。
性能試験やチューニングが目的ならば、
sar を軸に他の情報も補っていきます。
気になるプロセスについては ps -eo pcpu,pmem,args または top などで
プロセス単位の情報も調べることになるかもしれません。
あと、Webサーバならばアクセスログから400番台や500番台の応答が返っていないか、
DBならば問い合わせの応答時間やデッドロックが無いか、
・・・とか、まぁ、色々、ですねー・・・
なお、その収集処理自体が負荷にならないか、ですが、
4秒周期程度で取得したところで、経験上は、大した負荷になりません。
あらかじめ前述の ps -eo 等で、その収集プロセスの負荷を確認しておくと安全かと。*3
これで前準備は終了です。
つぎはグラフ化します。
「gnuplotでグラフ化」へ