サーバー管理で知っておきたいコマンドあれこれ。 - sysstat編 - | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

sysstatは、定期的にサーバーの情報をバイナリで保存する為のツールです。

sysstatで収集される情報は、CPUの負荷、ディスクI/O、メモリの使用状況、ネットワークデバイスの情報など実に多岐に渡ります。

サーバーに何らかの問題が発生したときに、その際に起きていた情報を見ることで何が原因になっているかを突き止める際に、sysstatは便利です。

sysstatは複数のコマンドで形成されています。


sa1 : 指定の時間ごとにサーバーの情報を収集し、「saXX」ファイル(XXは日にち)を出力する

     ※ 内部的にはsadcというコマンドが読み出されて収集しています

sa2 : sa1の統計情報ファイル(saXX)を1日の結果としてレポート(sarXXファイル)に纏め上げる

sar : sa2で出力されたレポートを人が見て分かる形に出力する。または、リアルタイムにサーバー

    情報を収集し出力する。


sysstatで収集された情報を見る方法は、2種類あります。


  • sarコマンドを利用する
  • sarXXファイルの中をページャで表示する

まず、sarコマンドについてですが、端末で


$ sar

と入力するとその日のCPU情報がずらっと表示されるかと思います。

表示単位は、指定の時間(後述)ごとに表示されます。


表示例

12時40分01秒 CPU %user %nice %system %iowait %idle
12時50分01秒 all 0.29 0.00 0.06 1.17 98.48
13時00分01秒 all 0.29 0.00 0.06 1.23 98.42
13時10分01秒 all 0.30 0.00 0.06 1.23 98.41

一方で、sarXXファイルを覗くことでも情報を見ることが可能です。

sarXXファイルの場所は、sysstatのバージョンなど環境によって異なってくるかと思いますが「/var/log/sa」や「/var/adm/sa」などにあるかと思いますので、探してみて適当なページャで開いて見てみてください。

ただし、sarコマンドの出力結果と「sarXX」のファイルの内容は少し異なります。

sarコマンドをオプション無しで実行すると当時のCPU情報だけが表示されますが、先に書いた

ようにsysstatは、CPU情報の他にもメモリやディスクI/Oなど様々な情報が収集されており、それが「sarXX」ファイルには書き込まれています。


sarコマンドでも、オプションを指定することによってCPU以外の情報を見ることが出来ます。

オプションや、表示される項目の内容については、下記がかなり詳しく書かれています。


sysstat で性能管理 (その1)@freewheelburning.com


sysstat で性能管理 (その2)@freewheelburning.com


また、sarコマンドはリアルタイムに情報を収集し表示させる事も可能です。

例えば、ディスクI/Oの情報を5秒おきに10回収集し出力するには、下記のようにコマンドを実行します。


$ sar -b 5 10

13時52分15秒 tps rtps wtps bread/s bwrtn/s
13時52分20秒 0.00 0.00 0.00 0.00 0.00
13時52分25秒 0.00 0.00 0.00 0.00 0.00
13時52分30秒 0.00 0.00 0.00 0.00 0.00
-snip-

話を少し戻しまして、sa1とsa2コマンドについてですが、こちらは毎日定期的動かし、情報の収集・集計を行っています。

動作はcronによりキックされます。

例えば、私の環境(RedHatES4)では、「/etc/cron.d/sysstat」ファイルに、下記のように記載されています。


# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib/sa/sa2 -A 


見ると分かるように、sa1コマンドが10分毎に、sa2コマンドが毎日23時53分に実行されています。

sa1(sadc)とsa2の動作をまとめると、下記のような流れになります。


  1. 10分毎にsa1コマンドにより、サーバーの情報が、「/var/log/sa/saXX」ファイルに書き込まれます。
  2. 23時53分になると、sa2コマンドが起動し、「/var/log/sa/saXX」ファイル内の集計情報を整理し、「/var/log/sa/sarXX」ファイルを出力します。

sarXXの「XX」部分は、日にちを表しています。

「01」なら1日、「25」なら25日です。

ただし、それが当月なのか前月なのかはサーバー情報(レポート)の保存期間の設定によって異なってきます。

sysstatの情報の保存期間は、「/etc/sysconfig/sysstat」にある設定ファイル内に記載されています。


# How long to keep log files (days), maximum is a month
HISTORY=7

上記だと、7日分のログが保存されます。

つまり、今日が6月5日だとしたら、「sar30」は前月の30日の収集情報になります。
保存期間を延ばしたければ、上記の設定ファイル内の数値を変更する事で可能です。(最大1ヶ月分)

では、保存された過去のsysstatのサーバー情報をどうやってみるかと言うと、これも2種類あって


  • sarコマンドの「-f」オプション付きで、「saXX」ファイルを指定する
  • 見たい日付の「sarXX」ファイルをページャで開いてみる

です。

「sarXX」ファイルは、一連のサーバー情報が全て格納されていますので、ピンポイントに情報を見たいならsarコマンドを利用した方が便利かもしれません。

例えば、30日のディスクI/O情報を見たければ


$ sar -b -f /var/log/sa/sa30

とすることで、30日のディスクI/O情報が表示されます。


ある日に起こった問題を後から原因究明する場合などに、syslogなどの情報と合わせて、その時のサーバー情報を参照すればより早く究明できるかもしれません。

ただし、sarXXやsaXXで出力される結果は、あくまで毎日10分ごとにsa1コマンドで収集された情報です。

収集した10分から次の10分の間に起こった情報は、収集されていません。

当然、ロードアベレージが高くなったなどの場合は、10分の間で徐々に変化が起きるため、何かあったことが感じ取れますが、問題が起きたそのときにどれ位の負荷があったのかを正確にここから読み出すことは出来ません。

ですので、特定の時間帯にサーバーの負荷が高くなったりする問題に悩まされている場合などは、この情報を見るよりも、sarコマンドでもっと細かな単位で情報収集してみるほうが良いでしょう。


例) 10秒ごとに丸一日(8640回)、情報を収集しその結果を「sar20070605」ファイルに出力する

$ sar 10 8640 -o sar20070605

ただし、sarの出力結果のファイルはかなり容量がでかいので、もっと限定的にして試した方が無難です。

また、深夜などで情報を収集したい場合は、バックグラウンドで動かしておけばよいでしょう。


※ sarコマンドには「-s」オプションと「-e」オプションがあり、開始時刻と終了時刻を指定できますが、これはあくまで

  レポートを見るときの開始と終了の時刻を指定するだけなので、タイマーのように終了時刻をセットできると言うわけ

  ではありません。


sarコマンドは集計情報をファイルに出力する(-oオプション)場合は、集計間隔と集計回数を指定しなければ

いけませんので、それを上手く使えば特定時間だけのサーバー情報を収集すると言う事も可能です。


例) 深夜3時から、60秒ごとに60回(計1時間だから4時まで)サーバー情報を取得する


下記をcronにセットしておく


0 3 * * * /usr/bin/sar 60 60 -o /var/log/sar0300-0400


肝心なのはレポートの読み方とそこからどう問題点を究明していくかですが、まずはこういったツールで

何が出来るのかということを知っておくと良いと思います。