UNIXコマンドでサーバ監視して結果をグラフ表示
サーバの監視は普段Zabbixで「Load Average」「CUP Utilization」「Memory」「Disk Space」「Traffic」を監視しているけど、これらを監視する仕組みを一から自作したのでメモ。言わば超簡易Zabbix。
作る理由はただの興味。実際の監視は引き続きZabbixを使うのです。(`・ω・´)
大まかな方針は以下のとおり。
uptime
などのUNIXコマンドをcronで5分ごとに実行して、結果をファイルに記録する- 結果をPHPプログラムで集計する
- jqPlotでグラフ表示
監視には以下のコマンドを使ってみます。他にもっと適切なコマンドとかがあれば、こっそり教えてくれると喜びます。
■Load Average
$ uptime
00:00:01 up 170 days, 5:24, 0 users, load average: 0.00, 0.00, 0.00
■CUP Utilization
$ mpstat 10 5
Linux 2.6.32-504.1.3.el6.x86_64 (www.example.com) 2015年05月23日 _x86_64_ (2 CPU)
00時00分01秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
00時00分11秒 all 7.74 0.00 1.40 1.35 0.00 0.05 0.65 0.00 88.81
00時00分21秒 all 0.55 0.00 0.40 0.05 0.00 0.00 0.15 0.00 98.85
00時00分31秒 all 0.15 0.00 0.15 1.25 0.00 0.00 0.25 0.00 98.20
00時00分41秒 all 0.20 0.00 0.30 0.65 0.00 0.05 0.15 0.00 98.65
00時00分51秒 all 0.15 0.00 0.20 0.05 0.00 0.00 0.30 0.00 99.30
平均値: all 1.76 0.00 0.49 0.67 0.00 0.02 0.30 0.00 96.76
■Memory
$ vmstat 10 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 2 259344 124540 174536 274200 3 1 56 63 1 1 1 0 97 1 1
0 0 259344 100656 174536 274276 0 0 0 236 383 269 8 1 89 1 1
0 0 259344 129760 174536 274272 0 0 0 209 148 155 1 0 99 0 0
0 0 259344 129884 174536 274272 0 0 0 233 121 143 0 0 98 1 0
0 0 259344 129760 174544 274272 0 0 0 324 127 141 0 0 99 1 0
■Disk Space
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda3 100762004 4012036 91624800 5% /
tmpfs 510084 0 510084 0% /dev/shm
/dev/vda1 243823 130875 100148 57% /boot
■Traffic
$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 22940909905 393345389 0 0 0 0 0 0 22940909905 393345389 0 0 0 0 0 0
eth0: 20118935741 311131513 0 0 0 0 0 0 517575153 2149502 0 0 0 0 0 0
eth1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vmstat
と mpstat
については、計測間隔と計測回数を指定しないと意図した値を得られなかった。また、/proc/net/dev
に記録されているのは総トラフィック量なので、その時のトラフィック量を調べるには差分を計算する必要がある。
以下、具体的な記録方法。
まずはroot権限で、コマンドの結果を格納する場所を作ります。また、結果ファイルをPHPから読み出せるようにしておきます。(PHPはwebmasterの権限で実行するという想定。)
# cd /var/log
# mkdir command
# chown webmaster. command
以降はwebmasterユーザで作業。まずは command
内に、コマンドの結果を格納する場所を作ります。
$ mkdir uptime
$ mkdir mpstat_10_5
$ mkdir vmstat_10_5
$ mkdir df
$ mkdir cat_proc_net_dev
結果は /var/log/command/uptime/20150307/2215.log
のようなディレクトリ名・ファイル名で格納するものとします。試しにコマンドを実行。
$ mkdir /var/log/command/uptime/`date +'%Y%m%d'`/
$ uptime > /var/log/command/uptime/`date +'%Y%m%d'`/`date +'%H%M'`.log
$ mkdir /var/log/command/mpstat_10_5/`date +'%Y%m%d'`/
$ mpstat 10 5 > /var/log/command/mpstat_10_5/`date +'%Y%m%d'`/`date +'%H%M'`.log
$ mkdir /var/log/command/vmstat_10_5/`date +'%Y%m%d'`/
$ vmstat 10 5 > /var/log/command/vmstat_10_5/`date +'%Y%m%d'`/`date +'%H%M'`.log
$ mkdir /var/log/command/df/`date +'%Y%m%d'`/
$ df > /var/log/command/df/`date +'%Y%m%d'`/`date +'%H%M'`.log
$ mkdir /var/log/command/cat_proc_net_dev/`date +'%Y%m%d'`/
$ cat /proc/net/dev > /var/log/command/cat_proc_net_dev/`date +'%Y%m%d'`/`date +'%H%M'`.log
問題なければ、これらのコマンドをcronに登録。(mkdir
では、翌日用のディレクトリを作成するように変更しているので注意。当日用のディレクトリを作成して即結果を保存、は「ディレクトリがありません」のエラーになったため。)
# vi /etc/crontab
00 00 * * * webmaster mkdir /var/log/command/uptime/`date -d '1 days' +'\%Y\%m\%d'`/
*/5 * * * * webmaster uptime > /var/log/command/uptime/`date +'\%Y\%m\%d'`/`date +'\%H\%M'`.log
00 00 * * * webmaster mkdir /var/log/command/mpstat_10_5/`date -d '1 days' +'\%Y\%m\%d'`/
*/5 * * * * webmaster mpstat 10 5 > /var/log/command/mpstat_10_5/`date +'\%Y\%m\%d'`/`date +'\%H\%M'`.log
00 00 * * * webmaster mkdir /var/log/command/vmstat_10_5/`date -d '1 days' +'\%Y\%m\%d'`/
*/5 * * * * webmaster vmstat 10 5 > /var/log/command/vmstat_10_5/`date +'\%Y\%m\%d'`/`date +'\%H\%M'`.log
00 00 * * * webmaster mkdir /var/log/command/df/`date -d '1 days' +'\%Y\%m\%d'`/
*/5 * * * * webmaster df > /var/log/command/df/`date +'\%Y\%m\%d'`/`date +'\%H\%M'`.log
00 00 * * * webmaster mkdir /var/log/command/cat_proc_net_dev/`date -d '1 days' +'\%Y\%m\%d'`/
*/5 * * * * webmaster cat /proc/net/dev > /var/log/command/cat_proc_net_dev/`date +'\%Y\%m\%d'`/`date +'\%H\%M'`.log
これでコマンドの実行結果がどんどん記録されていくので、あとはPHPで読み出すプログラムを作成すればOK。