【メモ】 サーバのLoad Averageなどを監視するコマンド「top」をログに保存する
【メモ】 サーバのLoad Averageなどを監視するコマンド「top」をログに保存する(PHP版)
【メモ】負荷測るならtopでLoad Averageよりsarの方が…
んで、とりあえずめどがついたっぽいのでとりあえずまとめのメモ。
今回の目的は「単体サーバの状況を視認しつつ結果を非技術者にわかりやすい形で提供する」です。技術的には不要なこともしてるんですが、その辺は考慮していただく方向で。『コマンドをPHPから叩いて保存して負荷観測する』という乗りかかった船のまとめだと考えてください。サーバが複数ある環境でのきちんとした監視なら、gangliaなどを入れてみる方が賢いです。
sarを使うためにsysstatをインストール
yumで簡単にインストールできた。# yum install -y sysstat
cronを使ったログの記録にも自動的に対応してくれる。
ちなみにOSはCentOS 5、インストールされたsysstatは7.0.3だった。バージョンの違いは気になる(最新版からすると相当古い?)けど、別に動けばいいから気にしないことにする。実際問題なく動いた。
計測の対象にする値の設定
とりあえずサーバの健康状態を把握するのに必要だと思われる数値は以下の4つ、ということにしてみる。- Load Average
- CPU使用率
- iowait
- メモリ使用率
計測の対象にする値について
Load Averageはざっくり言うとCPUとディスクI/Oの合算なのでボトルネックの把握にはならないけども、ざっくり負荷が掛かってるか否かを判断する時には役立つ…よね?(不安)ここでid:naoyaさんが書かれているとおり、マルチコアでの正常値の算出のためにはある程度負荷が掛かっていることが重要(低負荷だとCPU0に負荷が偏る)なのだけど、現在の所総じてかなりの高負荷なので気にしないことにする。計測にはsarでは出来ないのでtop…ではなくて、uptimeを使うことにする。
CPU使用率はマルチコアってことでちゃんと考えると平均値じゃダメな気がするけど、とりあえず平均値で行ってみる。あまりに偏りが酷いようならCPU0のみとかで。
計測はsarで行う。
iowaitはI/O待ち時間。この数字通りに待機させられているというわけでもないようだし、この数字の上昇が必ずしもCPUを圧迫しているというわけでもないようだけど、統計的な意味でディスクI/Oの負荷変遷としては指標になるだろう…ということで。
計測はsarで行う。
メモリ使用率は表示される数字がいわゆるメモリのビジーさ加減を示しているわけではないので計算が必要。多分以下で計算できるはず。
(used – buffers – cached) / (free + used)
計測はsar -rで行う。
PHPからコマンドを起動する
popen()を使えば問題ない。例えば以下で結果を1行ずつ表示することができる。$pp = popen('/usr/bin/sar -r 1 1', 'r');
while(!feof($pp)):
var_dump(fgets($pp));
endwhile;
pclose($pp);
$pp = popen('/usr/bin/uptime', 'r');
while(!feof($pp)):
var_dump(fgets($pp));
endwhile;
pclose($pp);
結果を抜き出したければ正規表現でゴニョる。
計測したデータをDBに保存しグラフ表示
sarのログデータを読み込んでグラフ化しても構わないのだけど、加工することと複数の数字を横断的に見ることを念頭にプログラムをCronで回してSQLiteに保存してみる。そこからXMLとして出力してFlashに食べさせてグラフ化的な感じ。自分だけがチェックするんだったら、こんなことする必要は全くないんだけど、非技術者に動的に見せることを考えるとsarコマンドで表示されるような数字の羅列ではわかってもらえないので。
グラフ化Flashはこれを使用。
amCharts: Line & Area chart