MRTG


MRTGとは数値をグラフ化するソフトである。
ただそれだけ。
ただそれだけではあるが、2組(MRTGの場合は2つの数値を1つのグラフに表示するため)の数値さえあればどんなものでもグラフ化できる。
インストールに特に難しいことはないがmrtg.cfgの設定は多少の理解が必要となる。
mrtg.cfgの設定に基づいてmrtgはデータを作るわけだが、そのデータをはめ込むためのhtmlファイルを作るのがindexmakerだ。
コイツにも多くのオプションがあり、タイトルを付けたりグラフを縦にしたり(デフォルトでは横二列)と設定があるのでお気に入り?の設定を作ったらそれをファイルにして実行権を与えておけばいちいちタイプする必要がない。
いずれも詳しく解説されたページが沢山あるのであえてここで書くこともないだろう。
MRTGでネットワーク伝送量やメモリ使用量をグラフ化しようとすると、そのデータを取得するためのものがいる。
MRTGは数値をグラフ化するだけであって、元になるデータは何らかの手法で作らなければいけない。
ここで一般的なのはsnmpではないかと思う。
ただしFreeBSD7にはうまくインストールが出来なかった。
対策としてportsのアップデートを行った。
アップデートにはCVSupを使うが、古いportsを消すだけで相当な時間がかかり、最新版に書き直すのにも又時間がかかる。
寝る前に仕掛けておけば朝までには出来ているだろうが、その程度の待ち時間は必要だと言うこと。
F&Fのサーバには都合によりPerl5.8.5と5.10が入っているのだが、/usr/bin/perlと/usr/local/bin/perlのバージョンが一致していないとうまく行かない。
F&F的には/usr/bin/perlと/usr/local/bin/perlでバージョンを分けていたのだがこれは失敗の元だった。
snmpをインストールして/usr/local/share/snmp/snmp.con
を編集する。
これに関しても多くは他のページに譲るが、例えばhttpdの起動数を取得したい場合はproc httpd 150 1 などと書き加える。
が、書き加える位置によって情報を取得する場合のMIBが違ってくるので気をつけること。
snmpd.confの他のprocの記述の前にproc httpd 150 1を書き加えればTarget[httpd] .1.3.6.1.4.1.2021.2.1.5.1&.1.3.6.1.4.1.2021.2.1.4.1 public@192.168.1.50 になるし、2行目に書き加えればTarget[httpd] .1.3.6.1.4.1.2021.2.1.5.2&.1.3.6.1.4.1.2021.2.1.4.2 public@192.168.1.50 となる。
最後の桁が何行目にproc httpdを書き加えたかになるのだ。
というか、一行目にこれを追加すると当たり前ながら後ろのproc hoge を取得する場合の数値が違ってくる。
もっともローカルな環境ではsnmpを使わずに、perlでちょこっと書けばcpu負荷でもネットワークパケット量でも取得は可能ではある。
例えばメールの送受信数はこちらのものを使わせていただいている。
(説明はこちらにある)ただしログフォーマットなどによって改造が必要かも知れず、F&Fでは改造して使っている。
デーモンとしてmaillogをチェックするのがupdate-mailstats.pl
ここで作られたDBファイルの数値増加分を過去ファイルと比較してMRTGに渡すためのものがmrtg-mailstats.pl
このmrtg-mailstats.plから呼ばれる、数値を得る部分がmailstats.plである。
デーモンを起動するとmaillogをチェックしてDBファイルの中身をインクリメントするのだが、ログにあわせて多少の変更を要するかもしれない。
数値はどんどん増えていくのでclear-mailstats.plをcronか何かで動作させる(そのときにはpostfizを止めたほうが良いのは言うまでも無い)とDBファイルの中身をクリアしてくれる。
cpu負荷に関しては、例えはIdle 0%になったとしてもsnmpで見た負荷は100%にはならない。
どの部分の負荷を見ているかによるとは思うが、何をどのように検出したいのか、だ。
HDDの温度検出はsmartctlを使用している。
HDDがこれに対応していれば各種情報が手に入る。
外気温度&湿度はDavisの気象計のはき出すデータをMRTGに渡しているだけだ。
MTRGに数値さえ渡せれば、羊の数さえもカウントしてくれるに違いないが、その数値を渡す工夫は必要だ。
MRTGはdaemonとするかcronで起動するかにかかわらず、その数値を取得するのは起動インターバル時間においての一瞬である。
平均値云々と言っても、細かなサンプリングによる平均ではなく(デフォルトだと)5分ごとに行われる瞬間値に過ぎない。
従ってCPU負荷にしてもhttpd起動数にしても、その数値を取得する側でピークホールドするなり平均を求めていかなければサンプリング時間(5分)以内に瞬間的に起きるイベントを検出することが出来ない。
例えば5分ごとにCPU負荷が急上昇するような事態に見舞われたとする。
負荷上昇は毎時1,6,11分…だったとして、MRTGの起動が毎時0,5,10分…だと、その負荷上昇はMRTGのグラフには表れない。
従ってそれらを検出したいと思うならば、連続的に負荷を監視して前処理するための何かが必要になる。
 【追記】optionにabsoluteとgaugeがある(他にもavgpeakなども)のだが、この動作が今ひとつよく分からない。
本家によれば、absolute 計測値の差分の時間平均を取るが、差分の片方は常にゼロ(だからabspluteか)なので、平たく言うと計測値をサンプリング時間で割った値になるのだろうか?しかし実際にはそうならないようだし、別のページには異なる内容が書かれていたりする。
gauge カウンタ値を増やさずその値をそのまま使うと、これも他のページでは異なる内容が書かれているものもある。
では実際にどうなるのか。
トラフィックデータにabsoluteオプションを付けると、前回測定値と今回測定対の差分を取らずにグラフを書くので、グラフは右上がりにどんどん伸びていく。
従って動作としては本家に書かれているとおりだと思う。
ただし平均値云々に関しては???だ。
snmpから得られる中で数値データがある。
例えばCPU負荷などがそれなのだが、この場合はgaugeオプションのみだとグラフが表示されない(数値がゼロのまま)。
これはおかしくないかい?何故差分平均を取るabsoluteを付けなければ表示されないのか。
snmpの方は少し分かりにくいので、外気温度のグラフで実験してみた。
オプションを何も付けない場合:これは差分を取って平均化すると解釈している。
absoluteオプションのみ付ける:差分の時間平均が取れれるので温度と湿度が微分値で表示されるはずだ。
gaugeオプションのみ付ける:計測値をそのまま表示するはずだ。
absoluteとgaugeオプションを付ける:どうなるのかよく分からないが、サンプルのmrtg.cfgにはこの記述がされているものもある。
こうして実験してみた。
ただ外気温度データは上下動が少ないので5分間の差分では良くなかったかも知れない。
【absolute,gaugeを付けた場合】正しい値が表示された。
【absoluteのみ付けた場合】何も表示されなかった。
【gaugeのみ付けた場合】正しい値が表示された。
【何も付けなかった場合】何も表示されなかった。
と言うわけで、結局の所よく分からない。
何も付けなかった場合は差分を表示してくれるのではないかと思うのだがそうではない。
試しにMRTGが起動される度に数値が増えるスクリプトを食わせてみたが何も表示されなかった。
結局の所スクリプトなどからデータを渡して貰う場合には、必要な処理はスクリプト側で行い、MRTG側にはabsolute,gauge両方のオプションを指定しておけばいいとしか言い様がない。
mrtg.cfg