Linux/sarをグラフ化その1(sarでデータ取得

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でグラフ化」へ


*1 そして、Excelもgnuplot無しで戦わなければならない方は、参考までに、こちらへどうぞ「CSVファイルをJavaScriptでグラフ化
*2 「\rm」でエスケープすることで「alias rm 'rm -i'」のような alias を無効にします、が cronでaliasは付かないと思いますが、なんとなく・・・。あと -f でファイルの有無を無視します、が エラーメッセージは一応 /dev/null へ捨てるようにしましたが、なんとなく。
*3 サーバの使用目的次第です。多くの通信処理をするサーバで netstat -na で使用ポート一覧を拾ったらかなりの負荷になったことがありますが・・・その時は数千行の出力があったので。