はじめに
先日cactiを設定しましたが、そもそものrrdtoolsの設定を忘れているため、直接設定することで理解を深めたいと思います。
参考文献のサイトがかなり良質なので、細かいパラメータ等はそちらを参考にして頂いた方が分かりやすいと思います。
目次
サーバ環境
製品名 | Dell OPTIPLEX SX280 |
CPU | Intel Pentium4 CPU 2.8GHz |
メモリ | 3GB(PC2-5300U(1GB) x 1枚、PC2-5300U(2G) x 1枚) |
ストレージ | IBM SATA 160GB |
IO負荷のグラフ作成
ログファイル(.rrdファイル)の作成
apacheでアクセスできるように/var/www/の下にrrdtoolsディレクトリを作成します。
root@labo:~# mkdir /var/www/rrdtools
root@labo:/var/www/rrdtools# rrdtool create IO.rrd --start N --step 60 DS:io-read:COUNTER:120:0:U DS:io-write:COUNTER:120:0:U RRA:LAST:0.5:1:1440
rrdtool createにて.rrdファイルを作成します。オプションについては以下の通りです。
- –start N
- 現在時刻からデータ取得を開始
- step 60
- 60秒おきにデータを取得します。通常は300秒が使われますが、試験的に短くしています。
- DS:io-read:COUNTER:120:0:U
- データソース(DS)の設定です。格納するデータについて定義します。
・2つ目のio-readは任意の名前です。IO readを取得するため、io-readとしています。
・3つ目のCOUNTERは単純増加する値に使用(0クリアの可能性があるものはDERIVE)。IOはどちらか分からなかったのでCOUNTERにしましたが、DERIVEかもしれません。
・4つ目の120は、120秒データが記録されなかったらunkownとします。120(=60 x 2)のため、1ステップ分記録されなければunknownです。
・5,6つ目の0:Uは値の範囲指定。Uは上限無しです。 - DS:io-write:COUNTER:120:0:U
- 見方は上記のreadと同じため割愛します。
- RRA:AVERAGE:0.5:1:1440
- ラウンドロビンアーカイブ(RRA)の設定です。例えば1分おきに取得したデータ以外にも、5分毎の平均を100個、10分毎の最大値を300個保存といったように、複数の丸めたデータを残すことが可能です。
・1つ目のLASTは、3つ目で1を指定した場合に使用します(他にAVERAGE、MIN、MAXがあります。)
・2つ目の0.5はアーカイブする区間に何割unknowuがあったらunknownとするかを指定します。3つ目に1を指定している場合、特に意味はありません。
・3つ目の1は何個をまとめてアーカイブするか。1を指定すると取得した値を丸めずに利用します。
・4つ目の1440は保存するデータ数(1分おきに取得して丸一日取得するため、1日の分数)
ログファイルの確認
以下のコマンドで.rrdファイルのデータが確認できます。
root@labo:/var/www/rrdtools# rrdtool info IO.rrd filename = "IO.rrd" rrd_version = "0003" step = 60 last_update = 1310046508 header_size = 860 ds[io-read].index = 0 ds[io-read].type = "COUNTER" ds[io-read].minimal_heartbeat = 120 ds[io-read].min = 0.0000000000e+00 ds[io-read].max = NaN ds[io-read].last_ds = "U" ds[io-read].value = 0.0000000000e+00 ds[io-read].unknown_sec = 28 ds[io-write].index = 1 ds[io-write].type = "COUNTER" ds[io-write].minimal_heartbeat = 120 ds[io-write].min = 0.0000000000e+00 ds[io-write].max = NaN ds[io-write].last_ds = "U" ds[io-write].value = 0.0000000000e+00 ds[io-write].unknown_sec = 28 rra[0].cf = "LAST" rra[0].rows = 1440 rra[0].cur_row = 507 rra[0].pdp_per_row = 1 rra[0].xff = 5.0000000000e-01 rra[0].cdp_prep[0].value = NaN rra[0].cdp_prep[0].unknown_datapoints = 0 rra[0].cdp_prep[1].value = NaN rra[0].cdp_prep[1].unknown_datapoints = 0
ログの更新
rrdtool updateコマンドにて.rrdファイルにデータを保存していきます。
シェルスクリプトでファイルを作成し、cronで定期取得します。
rrdtoolは単なるデータベースなので、値はsnmpgetで取得する必要があります。
書式
$ rrdtool update rrdファイル名 timestamp:val1:val2
上記val1,val2に、snmpgetで取得した値を入れ込みます。今回はio-readとio-writeの二つの値を取得するため、val1とval2の二つを指定します。
root@labo:/var/www/rrdtools# vi io.sh #!/bin/sh /usr/bin/rrdtool update /var/www/rrdtools/IO.rrd \ --template io-read:io-write \ `date +%s`:`snmpget -c public -v 1 -Oqv localhost 1.3.6.1.4.1.2021.13.15.1.1.3.1`:`snmpget -c public -v 1 -Oqv localhost 1.3.6.1.4.1.2021.13.15.1.1.4.1`
-Oqvを指定しないとObject名も取得されてしまうので要注意です。
cronに登録する前に、一度このスクリプトを実行してrrdファイルが更新されることを確認します。
root@labo:/var/www/rrdtools# chmod 755 io.sh root@labo:/var/www/rrdtools# ./io.sh root@labo:/var/www/rrdtools# root@labo:/var/www/rrdtools# rrdtool info IO.rrd filename = "IO.rrd" rrd_version = "0003" step = 60 last_update = 1310045341 header_size = 860 ds[io-read].index = 0 ds[io-read].type = "COUNTER" ds[io-read].minimal_heartbeat = 120 ds[io-read].min = 0.0000000000e+00 ds[io-read].max = NaN ds[io-read].last_ds = "213020672" ds[io-read].value = 0.0000000000e+00 ds[io-read].unknown_sec = 0 ds[io-write].index = 1 ds[io-write].type = "DERIVE" ds[io-write].minimal_heartbeat = 120 ds[io-write].min = 0.0000000000e+00 ds[io-write].max = NaN ds[io-write].last_ds = "574420992" ds[io-write].value = 3.9782400000e+04 ds[io-write].unknown_sec = 0 rra[0].cf = "AVERAGE" rra[0].rows = 1440 rra[0].cur_row = 421 rra[0].pdp_per_row = 1 rra[0].xff = 5.0000000000e-01 rra[0].cdp_prep[0].value = NaN rra[0].cdp_prep[0].unknown_datapoints = 0 rra[0].cdp_prep[1].value = NaN rra[0].cdp_prep[1].unknown_datapoints = 0
上記、強調箇所のlast_dsが更新されていることを確認後、cronに登録します。
root@labo:/var/www/rrdtools# crontab -e * * * * * /var/www/rrdtools/io.sh >/dev/null 2>&1
今回はrrdファイルを60秒おきの取得で作成しているため、60秒おきに取得します。
グラフ化
rrdtool graphコマンドで.rrdファイルに保存したデータをグラフ化します。
色やグラフの種類が豊富なため、非常に悩ましい箇所です。
書式
$ rrdtool graph [グラフ名] DEF:変数名=rrdファイル名:DS名:関数名 LINEx/AREA:上記変数名#色:”凡例”
DEFでデータを指定し、続くLINEx/AREAでグラフの種類や色を指定します。LINExは線グラフで、LINE1~3まであり数字が大きいほど太い線になります。AREAは塗りつぶし描写です。
以下では、試しにIO readを塗り潰し、IO writeを線グラフに指定してみます。
ログの更新と同じく、シェルスクリプトを用意してcronに追加します。
root@labo:/var/www/rrdtools# vi io_graph.sh #!/bin/sh /usr/bin/rrdtool graph /var/www/rrdtools/io.png --imgformat PNG \ DEF:read=/var/www/rrdtools/IO.rrd:io-read:LAST \ AREA:read#4668E4:"read" \ DEF:write=/var/www/rrdtools/IO.rrd:io-write:LAST \ LINE1:write#F51D30:"write"
データがread/writeの二つありますので、DEFとAREA/LINEのセットを二つ用意します。他のパラメータは上記書式と見比べて頂ければ概ね理解できると思いますので割愛します。
最後にcronに追加して終了です。
root@labo:/var/www/rrdtools# chmod 755 io_graph.sh root@labo:/var/www/rrdtools# crontab -e * * * * * /var/www/rrdtools/io.sh >/dev/null 2>&1 * * * * * /var/www/rrdtools/io_graph.sh >/dev/null 2>&1
本来であればログの更新の少し後にずらしてグラフを作成すべきですが、cronは1分以下での指定ができず、ずらせないため、同時に実行します。
しばらくすると以下のようなグラフが生成されました。
期待外れなグラフが完成しました。
グラフ化のスクリプトを少しチューニングします。
root@labo:/var/www/rrdtools# vi io_graph.sh #!/bin/sh /usr/bin/rrdtool graph /var/www/rrdtools/io.png \ --imgformat PNG \ --title "IO" \ --vertical-label "Blocks" \ --width 600 \ --height 240 \ DEF:read=/var/www/rrdtools/IO.rrd:io-read:LAST \ AREA:read#4668E4:"read" \ GPRINT:read:LAST:"現在値\: %6.2lf \n" \ DEF:write=/var/www/rrdtools/IO.rrd:io-write:LAST \ CDEF:write2=write,-1,* \ AREA:write2#F51D30:"write" \ GPRINT:write:LAST:"現在値\: %6.2lf \n"
–titleでグラフタイトルの追加、vertical-labelでY軸名を追加、–width/heightでグラフサイズの拡大、GPRINTで最新の取得データ値を表示しています。
また、writeの方は、CDEFにより取得値に-1をかけて反転させています。
百聞は一見にしかずということで、以下にグラフを載せておきます。
大分きれいになりました。