ふとレンタルサーバの負荷状況をモニタリングしてみようと思いました。
共有レンタルサーバではsnmpによるデータ取得が(たぶん)出来ないので、コマンドたたいたり、/proc配下の情報を読んだりしてデータを取得する事になりますが、取得方法によって取得できるデータの種類や出力フォーマットが異なります。
最終的に自動取得することになるので出来るだけ扱いやすいフォーマットがベターですが、情報を整理するために取得するまでに検討した手段や取得できるデータなど簡単に残しておきます。
Load Averageの取得
Load Averageは、平均的なCPUの占有状況を把握するのに役立つ情報です。一般的に1分、5分、15分の占有状況が取得てきます。
5分の値が1だったら「5分間、1つのCPUがずっと占有され続けているという状態だった」というくらいの認識でいいんじゃないかと思います。CPUが占有され続けると他の処理が疎かになるので、数値が高い場合には気を付けなければなりません。
少ないに越したことはありませんが、CPU(またはコア)が4個あるなら4まで平気、40個あるなら40まで平気、そんな感じだと思います。
uptime
uptimeは、本来サーバの起動時間を取得するコマンドですがLoad Averageも取得できます。
$ uptime
4:10pm up 538 days 6:02, 1 user, load average: 1.52, 1.28, 1.09
load averageに続く3つの数字が、1分、5分、15分の値です。
sar
sarは、Load AverageやCPU使用率など様々な情報が取得できるコマンドです。過去の情報を取得するには権限が必要ですが、リアルタイムの情報は権限不要で取得できます。
「-q」オプションを付けるとLoad Averageが取得できます。
sar -q 1 2 | grep ^Average
Average: 2 518 1.25 1.19 1.05
引数は、第1が取得間隔、第2が取得回数です。第2引数を0にすると継続的に出力されます。ここでは1秒間隔で2回分取得し、平均値を取得しています。
/proc/loadavg
/procは、CPUやメモリなどリソース関連の情報が数多く格納されている場所です。プログラムで取得する場合には、一番利用しやすいかもしれません。
loadavgには、Load Averageの情報が格納されています。
$ cat /proc/loadavg
0.92 1.14 1.05 1/535 6229
選んだ手段
コマンドや/procなどから取得できますが、最終的にphpにLoad Averageを取得する関数が用意されていたので利用しました。
$lavg = sys_getloadavg();
echo "1min:".$lavg[0]." 5min:".$lavg[1]." 15min:".$lavg[2];
CPU負荷状況の取得
CPUの負荷状況は、全体的なCPUの負荷状況を判断したり、どの種類のプロセスがCPUを占有しているかを把握するのに役立つ情報です。負荷率(パーセンテージ)で表すので直感的に把握しやすいです。
CPU負荷率は突発的に上がることがありますが、長時間続かなかったり、慢性的に負荷率が高くなければ問題ないと思います。
top
topコマンドはサーバ負荷のモニタリングで定番のコマンドです。プログラムで取得する場合には、バッチオプション「-b」を利用します。
$ top -bn2 | grep ^Cpu | tail -n1
Cpu(s): 4.3% us, 1.8% sy, 0.2% ni, 93.5% id, 0.2% wa, 0.0% hi, 0.1% si
「-n」オプションは取得する回数です。ここでは2回分を取得して、tailコマンドで最後の1回分だけ取得しています。2回目だけを取得しているのは毎回1回目には同じ結果が出力されるためです。
sar
sarは、Load AverageやCPU使用率など様々な情報が取得できるコマンドです。過去の情報を取得するには権限が必要ですが、リアルタイムの情報は権限不要で取得できます。
$ sar 1 2 | grep ^Average
Average: all 8.09 0.00 1.00 0.12 0.00 90.78
引数は、第1が取得間隔、第2が取得回数です。第2引数を0にすると継続的に出力されます。ここでは1秒間隔で2回計測し、平均値を取得しています。
sarコマンドが使えないレンタルサーバもありますが、数値だけを追う場合にはtopより便利です。cpu使用率の取得だけならmpstatも利用できます。
/proc/stat
/procは、CPUやメモリなどリソース関連の情報が数多く格納されている場所です。プログラムで取得する場合には、一番利用しやすいかもしれません。
statには、サーバが起動してからのCPUの利用時間などが記録されています。
$ head -n1 /proc/stat
cpu 4038229853 133540648 982371763 13298096432 105445521 2665 37003873 0 0
数値は時間経過と共に増えるので、2回取得した差分から負荷率を算出します。
負荷率 = 個別項目の差分 / 全項目の差分の合計 × 100
選んだ手段
差分を求める必要がありますが、細かく調整もしたかったので/proc/statを利用しました。
/proc/statは、topやsarなどの元となる情報なので手間がかかりますがこれを利用するのがいいと思います。
メモリ利用状況の取得
メモリはスワップアウトしてなければ必要以上に気にする必要はないと思います。最近は大容量のメモリを搭載しているサーバが多いので、ブログ中心のサービスだとメモリを使い切ることは稀じゃないかと思います。
freeとvmstat
freeは定番のメモリ利用状況を確認するコマンドです。再利用は少し手間ですが、概要の把握に十分な項目は揃っています。
$ free
total used free shared buffers cached
Mem: 8238724 7834488 404236 0 162488 5426076
-/+ buffers/cache: 2245924 5992800
Swap: 1052216 70812 981404
OSのバージョンによっては「available」というメモリ利用可能量が把握できる項目が追加されています。
$ free
total used free shared buff/cache available
Mem: 197799384 8651392 727628 8099372 188420364 178510200
Swap: 102399996 429076 101970920
vmstatも定番のコマンドです。CPU負荷状況も一緒に取得できますが、1回目の結果は同じなので2回目以降のデータを取得します。
$ vmstat 1 2 | tail -n1
0 0 70872 473268 178720 5340060 0 0 0 3668 2023 2971 2 6 91 1
sar
sarは、Load AverageやCPU使用率など様々な情報が取得できるコマンドです。過去の情報を取得するには権限が必要ですが、リアルタイムの情報は権限不要で取得できます。
「-r」オプションを付けるとメモリ使用状況が取得できます。freeに比べると再利用しやすいです。
$ sar -r 1 2 | grep ^Average
Average: 155998 8082726 98.11 173320 5631866 981412 70804 6.73 2732
引数は、第1が取得間隔、第2が取得回数です。第2引数を0にすると継続的に出力されます。ここでは1秒間隔で2回取得し、平均値を取得しています。
/proc/meminfo
/procは、CPUやメモリなどリソース関連の情報が数多く格納されている場所です。プログラムで取得する場合には、一番利用しやすいかもしれません。
meminfoには、メモリに関する情報が多数格納されています。
$ cat /proc/meminfo
MemTotal: 8238724 kB
MemFree: 278928 kB
Buffers: 174256 kB
Cached: 5540120 kB
SwapCached: 2732 kB
...
freeやvmstatに比べると項目数が多いので、詳細な利用状況を把握するのに最適です。freeはここの情報を整形したものです。
選んだ手段
今回は概要だけ把握できればよかったので、成形がしやすいvmstatを使う事にしました。
概要だけ欲しいならfreeやsar、詳細まで欲しいなら/proc/meminfoなど状況に応じて使い分けるといいと思います。
まとめ
レンタルサーバによって使えないコマンド、OSのバージョンによる表示項目の違いなどがありましたが、何とかデータが収集できるようになりました。
Cactiに流し込んで視覚的に把握するのが最終目的でしたが、無事完成させる事ができました。
データが貯まったら状況を書いてみたいと思います。
コメント