UJP - 技術情報1

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

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でテーブルの件数でグラフ化する

  • 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# 


広告スペース
Google