|
MRTGで好き数値でグラフを作る
MRTGで好きな数値でグラフを作る
0.改訂履歴
- 2007.01.01 新規作成
- 2007.02.07 MacOS Xのvm_statコマンドからのPageIn/Outの取得サンプルの追加
1.はじめに
このドキュメントでは,MRTGのグラフを,SNMPの値ではなく,自由にカスタムするための基本的な方法と,応用例について説明する. サンプルでは,/proc/statやvmstatからDisk I/O情報を取得したり,Disk usageがSNMPで取得できない場合や,各種MySQLのデータをmysqladminやmysqlモニタを利用してstatusやextended-statusを使いながら,取得してSlow_queriesやBytes_received等の取得方法について説明しており,Qcache_hitsやQcache_free_memory等の応用はもとより,任意の条件にマッチするデータ件数等をグラフ化する為のヒントを記載している.
2.独自の数値を記録するシェルを作成する
- MRTGでグラフを作成する為には,データを渡す必要がある.
- そのデータは,次のような形式となっている.
- 入力byte数
- 出力byte数
- 監視対象の稼働時間
- 監視対象ホスト名
- 稼働時間とホスト名は,不要なので,それらは出力しなくて良い.
- カスタムでグラフを作成する際の,最低限のシェルは,次の通りとなる.
#!/bin/sh
I_DATA=1
O_DATA=2
echo $I_DATA
echo $O_DATA
echo 0
echo 0
|
iMacG5:~ shinnai$ cat data.sh
#!/bin/sh
I_DATA=1
O_DATA=2
echo $I_DATA
echo $O_DATA
echo 0
echo 0
iMacG5:~ shinnai$ chmod ogu+x data.sh
iMacG5:~ shinnai$ ./data.sh
1
2
0
0
iMacG5:~ shinnai$
|
3.mrtg.cfgファイルにシェルを登録する
- 作成したシェルは,`(バッククォート)で囲んで以下のように記述する.
#-----------------------------------------------------------------
# Custom I/O
#-----------------------------------------------------------------
Options[custom_io]: growright
Target[custom_io]: `/usr/local/data.sh`
MaxBytes[custom_io]: 200
Title[custom_io]: Custom I/O
PageTop[custom_io]: <H1>Custom I/O</H1>
YLegend[custom_io]: Custom I/O
ShortLegend[custom_io]: blocks/s
LegendI[custom_io]:Read Block
LegendO[custom_io]:Write Block
|
- これにより,MRTGが実行される都度,このプログラムが呼び出され,実行される.
4.ディスク使用率を取得してみるサンプル
- ディスク使用率はSNMPで取得できるはずだが,たまに取得できない場合がある.
- たとえば,次のようなディスク構成のシステムがある.
[root@server bin]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/scsi/c0d0p5 22G 3.8G 18G 18% /
/dev/scsi/c0d0p1 240M 31M 197M 14% /boot
none 1.5G 0 1.5G 0% /dev/shm
/dev/scsi/c0d0p6 94G 32G 58G 36% /db01
/dev/scsi/c0d0p7 100G 14G 82G 14% /venus
/dev/scsi/c0d0p8 100G 61G 35G 64% /db03
/dev/scsi/c0d0p9 100G 566M 95G 1% /db04
/dev/scsi/c0d0p10 100G 68G 28G 72% /db05
/dev/scsi/c0d0p3 17G 5.9G 11G 37% /var
[root@server bin]#
|
- この/db01と/varの領域についてのusage値を取得するとなると,次のようなシェルを作成する.
#!/bin/sh
db01=`df -m |awk '$6=="/db01"{print$5}'|tr % ' '`
var=`df -m |awk '$6=="/var"{print$5}'|tr % ' '`
echo $db01
echo $var
echo 0
echo 0
|
- この例では,6列目が'/db01"にマッチする行の5列目(Use%の列)を取りだしている.
- 取り出した数値には%記号がついているので,trコマンドで排除している.
5.Disk I/Oを取得するサンプル
- Disk I/Oについての情報を知りたい場合には,/proc/statファイルのdisk_io部分を参照する.
[root@server admin]# cat /proc/stat|grep disk_io
disk_io: (8,0):(46378033,945965,15160800,45432068,910920982)
[root@server admin]#
|
(メジャー番号,マイナー番号):(読み書き回数, 読み込み回数, 読み込みブロック数, 書き出し回数, 書き出しブロック数) |
- この並びから,読み込み回数,書き込み回数について取得したい場合には,次のようなシェルを作成する.
#!/bin/sh
ReadCount=`cat /proc/stat|grep disk_io | tr -d '('|tr -d ')'| tr : ,| cut -f 5 -d','`
WriteCount=`cat /proc/stat|grep disk_io | tr -d '('|tr -d ')'| tr : ,| cut -f 7 -d','`
echo $ReadCount
echo $WriteCount
echo 0
echo 0
|
- 読み込みブロック数を取得したい場合には,次のようなシェルを作成する.
#!/bin/sh
ReadBlock=`cat /proc/stat|grep disk_io | tr -d '('|tr -d ')'| tr : ,| cut -f 6 -d','`
WriteBlock=`cat /proc/stat|grep disk_io | tr -d '('|tr -d ')'| tr : ,| cut -f 8 -d','`
echo $ReadBlock
echo $WriteBlock
echo 0
echo 0
|
- 構成によっては,/proc/statの出力結果が次のような場合もある.
[root@www54 admin]# cat /proc/stat|grep disk_io
disk_io: (3,0):(2,2,16,0,0) (8,0):(8610120,531734,6363996,8078386,159119992)
[root@www54 admin]#
|
読み込み回数・書き込み回数の値2
#!/bin/sh
ReadCount=`cat /proc/stat|grep disk_io | tr -d '('|tr -d ')'| tr : ,| cut -f 11 -d','`
WriteCount=`cat /proc/stat|grep disk_io | tr -d '('|tr -d ')'| tr : ,| cut -f 13 -d','`
echo $ReadCount
echo $WriteCount
echo 0
echo 0
|
- 同じように,ブロック数は,次のように列を修正する.
読み込みブロック数・書き込みブロック数
#!/bin/sh
ReadBlock=`cat /proc/stat|grep disk_io | tr -d '('|tr -d ')'| tr : ,| cut -f 12 -d','`
WriteBlock=`cat /proc/stat|grep disk_io | tr -d '('|tr -d ')'| tr : ,| cut -f 14 -d','`
echo $ReadBlock
echo $WriteBlock
echo 0
echo 0
|
6.Disk I/Oを取得するサンプルその2
- hpのマシンなどで,一部/proc/statのdisk_ioの値が取得できない機種がある.
- そのような場合,vmstatコマンドを使って取得してみる.
- vmstatコマンドを,5秒ごとに10回実行してみる.
[root@venus bin]# vmstat 5 10
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy wa id
0 0 2680 18320 7268 2369860 0 0 0 0 0 0 0 0 0 0
1 0 2680 18064 7316 2370064 0 0 2644 75 676 923 2 1 7 90
1 0 2680 20288 7360 2367792 0 0 2670 58 694 952 14 8 5 73
0 0 2680 17916 7408 2370116 0 0 2599 23 651 890 1 1 4 94
0 0 2680 18140 7456 2369840 0 0 2594 38 642 885 1 1 4 94
0 0 2680 18208 7508 2370936 0 0 2614 28 656 919 3 2 8 88
0 0 2680 17916 7560 2372844 0 0 2673 50 674 924 8 2 7 83
0 0 2680 19308 7604 2373048 0 0 2643 24 664 921 1 2 5 92
0 0 2680 19960 7648 2372352 0 0 2670 16 664 916 2 2 5 91
0 0 2680 19820 7704 2372436 0 0 2726 55 701 963 6 3 7 84
[root@venus bin]#
|
- ここで,bi列(入力ブロック数)とbo列(出力ブロック数)が,Disk I/Oを示す数値となるので,この値を取得する.
- 気をつけなければならないのは,vmstatコマンドは,最初の1行で表示される情報は,それまでの平均値なので,この値を取得してもリアルタイム性が無いので,vmstatコマンドを連続実行させ,一番最後の行の数値を取得する.
- また,vmstatコマンドでは,連続表示させていると定期的にヘッダ情報が表示されるが,不要なのでヘッダを表示させないようにする.
- この方法では,vmstatコマンドをデーモンのように連続実行させる必要があるが,OS再起動,シェルのログアウトなどのタイミングで実行されなくなることがあるので,起動してない場合には再起動させるようにする.
- まずは,次のようなシェルを作成する.
[root@venus bin]# cat /usr/local/bin/VMstatChecker.sh
#!/bin/sh
CountNum=`ps -ef | grep vmstat | grep -v grep|wc -l`
#echo $CountNum
if [$CountNum -eq 0 ];
then
echo vmstat boot
vmstat -n 5 >> /var/log/vmstatlog.log &
fi
[root@venus bin]#
|
- このシェルでは,プロセスリストを取得して,vmstatが無い場合にはvmstatの値を5秒ごとに更新してヘッダを出力せずに結果のみログファイルに出力させる様に実行している.
- このシェルプログラムを,定期的に実行させるようにcrontabに登録する.
[root@venus bin]# crontab -l
#VMstat Checker
*/5 * * * * /usr/local/bin/VMstatChecker.sh
[root@venus bin]#
|
- このvmstatの実行結果を記録したファイルの最終行をtail -n 1で取り出し,必要な列の読み取りブロック,書き込みブロックをを取り出して出力するシェルのサンプルが次の通り.
#!/bin/bash
RB_Count=`tail -n 1 /var/log/vmstatlog.log|tr " " ,|sed "s/,,/,/g"|sed "s/,,/,/g"
|sed "s/,,/,/g"|sed "s/,,/,/g"|sed "s/,,/,/g"|cut -f 11 -d','`
WB_Count=`tail -n 1 /var/log/vmstatlog.log|tr " " ,|sed "s/,,/,/g"|sed "s/,,/,/g"
|sed "s/,,/,/g"|sed "s/,,/,/g"|sed "s/,,/,/g"|cut -f 12 -d','`
echo $RB_Count
echo $WB_Count
echo 0
echo 0
|
- このシェルを,MRTG.cfgファイルから呼び出すようにすればよい.
7.MySQLのデータをグラフ化する その1
- MySQLは,mysqladminコマンドラインでステータスを取得して標準出力する事ができる.
- 標準形式の場合は次野表になる.
[root@venus bin]# mysqladmin -uroot -ppassword status
Uptime: 25284850 Threads: 11 Questions: 1664761951 Slow queries: 39735 Opens: 422255
Flush tables: 3 Open tables: 256 Queries per second avg: 5.840
[root@venus bin]#
|
- この様な形式の場合は,列を取り出せばよい.
- たとえば,Slow Query数を取得区する場合には,9列目なので次のようになる.
[root@venus bin]# cat MySQLSlowQuery.sh
#!/bin/sh
SlowQueryCount=`mysqladmin -uroot -ppassword status|cut -f 9 -d' '`
echo $SlowQueryCount
echo 10
echo 0
echo 0
[root@venus bin]#
|
8.MySQLのデータをグラフ化する その2
- 拡張出力をすると,次のように詳細な情報が取得できる.
[root@venus bin]# mysqladmin -uroot -ppassword extended-status
+----------------------------+------------+
| Variable_name | Value |
+----------------------------+------------+
| Aborted_clients | 25711 |
| Aborted_connects | 104766 |
| Binlog_cache_disk_use | 0 |
| Binlog_cache_use | 0 |
| Bytes_received | 451396284 |
| Bytes_sent | 1058356381 |
| Com_admin_commands | 8 |
| Com_alter_db | 0 |
| Com_alter_table | 274 |
| Com_analyze | 0 |
| Com_backup_table | 0 |
| Com_begin | 0 |
| Com_change_db | 560209418 |
| Com_change_master | 0 |
| Com_check | 0 |
〜略〜
| Sort_range | 42253754 |
| Sort_rows | 1145877288 |
| Sort_scan | 8929315 |
| Table_locks_immediate | 382605009 |
| Table_locks_waited | 6865333 |
| Threads_cached | 5 |
| Threads_connected | 11 |
| Threads_created | 1938815 |
| Threads_running | 1 |
| Uptime | 25284737 |
+----------------------------+------------+
[root@venus bin]#
|
- この形式の場合,2列目に項目名,4列目に値が表示されていることに着目する.
[root@venus bin]# cat MySQLBytes_recieved.sh
#!/bin/sh
Bytes_received=`mysqladmin -uroot -ppass extended-status |awk '$2=="Bytes_received"{print$4}'`
echo $Bytes_received
echo 0
echo 0
echo 0
[root@venus bin]#
|
9.MySQLでテーブルの件数でグラフ化する
[root@venus bin]# cat UserTableCount.sh
#!/bin/sh
KaiinSu=`echo "select count(*) from USRTBL" | mysql -uroot -ppass USRTBL |grep -v count`
echo $KaiinSu
echo 0
echo 0
echo 0
[root@venus bin]#
|
10.vm_statの値でPageIn/Outを取得する
- MacOSで,Linuxのfreeコマンドにあたる感じのコマンドが,vm_statである.
- コマンドを実行すると,次のように表示される.
iMacG5:~ server$s vm_stat
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free: 2954.
Pages active: 151544.
Pages inactive: 76400.
Pages wired down: 31242.
"Translation faults": 74351642.
Pages copy-on-write: 514356.
Pages zero filled: 52998758.
Pages reactivated: 3590019.
Pageins: 373417.
Pageouts: 333763.
Object cache: 39626 hits of 671712 lookups (5% hit rate)
iMacG5:~ servers$
|
- Page inとPage outの値を取得する.
- Page inとは,仮想記憶(Disk)から主記憶メモリにデータを読み出すことで,Page outとは主記憶メモリから仮想記憶に退避されるものである. つまり,page outが多い場合は,メモリが足りないと言うことになる.
- 次のようなコマンドを作成する.
iMacG5:~ servers$ root# cat MRTG_macPageInOut.sh
#!/bin/sh
PageI=`vm_stat |awk '$1=="Pageins:"{print$2}' |tr . ' '`
PageO=`vm_stat |awk '$1=="Pageouts:"{print$2}'|tr . ' ' `
echo $PageI
echo $PageO
echo 0
echo 0
iMacG5:~ servers$ root#
|
iMacG5:~ servers$ root# vm_stat; ./MRTG_macPageInOut.sh
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free: 95889.
Pages active: 33481.
Pages inactive: 106403.
Pages wired down: 26344.
"Translation faults": 488277449.
Pages copy-on-write: 11370269.
Pages zero filled: 268820579.
Pages reactivated: 3475800.
Pageins: 2062722.
Pageouts: 431141.
Object cache: 1708714 hits of 4810630 lookups (35% hit rate)
2062722
431141
0
0
iMacG5:~ servers$ root#
|
|
|