エントリー

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

vmstatmpstat については、計測間隔と計測回数を指定しないと意図した値を得られなかった。また、/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。

ページ移動

ユーティリティ

カテゴリー

検索

エントリー検索フォーム
キーワード

過去ログ

過去ログ表示フォーム
キーワード

Feed