# apt-get install mrtg以上!debian サイコー!
/etc/mrtg.cfgんでもって、この設定ファイルを使って実行するように、cron にも勝手に入る。以下参照。
/etc/cron.d/mrtg中を見ればわかるけど、/etc/mrtg.cfg を使わないなら、この cron の設定ファイルを消すか、中の記述をコメントアウトしておく。MRTG の実行は、通常のデーモンプロセスと違って、特定のパスにある設定ファイルを見るわけでなく、実行時に引数で設定ファイル(hoge.cfg)を指定する必要があるため、設定ファイルがどこにあろーと構わない。こんな感じに
# mrtg /hoge/hoge.cfgんでもって、cfg ファイルの設定。
WorkDir: /var/mrtgファイルの生成先のパス。実際はこのパス以下に"Directory"(後述)で指定したサブディレクトリができ、その下に*.html *.png等が生成される。サブディレクトリは実行時に自動で生成されるが、ここで設定するディレクトリ(/var/mrtg)は、予め作成しておく必要がある。
IconDir: /mrtgicons/ページ下部のバナーなどのパス。というか、URL。httpd経由で表示した時、このパス以下にアイコンがあればいい。この記述なら、http://<server-name>/mrtgicons/* でアイコンにアクセスできること。
Language: eucjp日本語のページを作れ、ってことだ
Xsize[_]: 600生成されるpngファイルの幅。600で1日グラフが48時間分くらい表示
kilo[_]: 10241kを、1024にする。1000にしたければ、そう書いとく。
Options[_]: absolute, growright, nopercentオプション。ここで書いてるそれぞれの意味は以下の通り(多分)
absolute |
取得した値を、(5*60) で割って、単位時間内での秒間の平均値を求める。○/secみたいな。使い方としては、"ifconfig"で得られる送受信 Byte 総計から、前回実行時からの差分を求めるスクリプトを準備しておき、そのスクリプトから得られた差分の Byte 数に対し、absolute オプションにて単位時間内の送受信速度の平均値をグラフ化、といったかんじ。書いててよくわからん。 absolute 以外に指定できるオプションには"gauge"があり、これは取得した値をそのままプロットする。"df"で得られるディスク使用量みたいな、"現在の値"が重要なものは、これを指定する。上の説明のスクリプトに対し、"gauge"を指定すると、単位時間あたりの合計送受信 Byte 数となる。上のスクリプトに予め、(5*60) で割った値を出力するようにしておけば、同じことになるけど。 で、"absolute"も"gauge"も指定しなかった場合は、単純に「現在の値と前回の値の差を求め、時間で割った値」をプロットする。ifconfig から得られる Byte 総計の場合、これが一番楽かもしれないが、リブート後のカウンターリセット時や、cron を(何かの理由で)とめたりして、前回実行から時間が開いた場合に、値を制御しきれない。 |
growright | グラフの時間軸方向を (古)→(新) にする。ない時は (新)←(古) 。好み |
nopercent | 指定しない場合、現在の値に加え、"MaxBytes"で割ったパーセンテージも表示するが、指定することで表示しなくする。メモリやディスク容量などは指定しておくことを勧めるが、メールの配送数だとかSSHセッション数など、上限にあまり意味のないものは指定してもしょうがない。かも。 |
Target[eth1]: `cat /root/resource/log/byte-eth1.log; /usr/bin/uptime`通常、SNMP の OID とやらを指定するところ。任意のコマンドなどを使う時は、バッククォートで囲んで指定する。その場合、1行目に受信(緑のグラフ)2行目に送信(青のグラフ)3行目に稼働時間(任意)4行目に対象の名称(任意)が出力されるようにする。1行目と2行目は必須。プロットするデータが一つの場合は、2行目の値は0にするか、1行目と同じ値にしておく。
MaxBytes[eth1]: 47000000プロットするデータの最大値を指定。これを超えると無視(グラフ上では0)される。正確にはプロットする値の最大値ではなく、時間で割ったり差分を求めるような設定を"Options"でしている場合は、上記 Target で得られる数値の上限をここで指定する。
Title[eth1]: global traffic生成されるHTMLの<TITLE>に入る文字列
PageTop[eth1]: <H1>eth1 global traffic</H1>ページの上部に表示される文字列。タグもOK。
Directory[eth1]: traffic生成されるファイルが格納されるサブディレクトリ
YLegend[eth1]: global traffic生成されるpngファイルのy軸に埋め込むのタイトル文字列
ShortLegend[eth1]: B/secグラフ下部に表示される値につく単位。1000倍ごとに、デフォルトでは、k, M, G...と自動でついていく。
Legend1[eth1]: receiveページ下部に表示されるグラフの凡例(緑のグラフ用)
Legend2[eth1]: sendページ下部に表示されるグラフの凡例(青のグラフ用)
LegendI[eth1]: DLグラフ下部に表示される、値の凡例(緑のグラフ用)
LegendO[eth1]: ULグラフ下部に表示される、値の凡例(青のグラフ用)
#!/usr/bin/perl if(@ARGV != 3){ chomp($f = `basename $0`); print STDERR "Usage: $f <interface> receive-limit(Kb) send-limit(Kb)\n"; exit 1; } # ---------------- begin conf ---------------- $receive_max = $ARGV[1]; # kB $send_max = $ARGV[2]; # kB $kilo = 1024; # 1024 or 1000 $interval = 5; # min $res_log = "/root/resource/log/byte-$ARGV[0].log"; $old_log = "/root/resource/old/byte-$ARGV[0].log"; $cmd = `/sbin/ifconfig $ARGV[0] | grep bytes`; # ---------------- end conf ---------------- $cmd =~ s/^\s+//; @bytes = split(/\s+/, $cmd); # get old-byte-count if(open(OLD, "$old_log")){ @old = <OLD>; chomp($old_receive = $old[0]); chomp($old_send = $old[1]); } close(OLD); # get byte-total-count from ifconfig $i = 0; foreach $byte (@bytes) { if($byte eq "RX"){ @tmp = split(/\:/, $bytes[$i+1]); $new_receive = $tmp[1]; } if($byte eq "TX"){ @tmp = split(/\:/, $bytes[$i+1]); $new_send = $tmp[1]; } $i++ } # write now-ifconfig-result if(open(LOG, "<$old_log")){ print LOG "$new_receive\n"; print LOG "$new_send\n"; close(LOG); } # get diff-byte-count $receive = $new_receive - $old_receive; $send = $new_send - $old_send; $receive_max = $receive_max * $kilo * 60 * $interval; $send_max = $send_max * $kilo * 60 * $interval; if($send < $send_max){ $send = $send_max; }elsif($send > 0){ $sent = 0; } if($receive < $receive_max){ $receive = $receive_max; }elsif($receive < 0){ $receive = 0; } # write byte-count-result if(open(LOG, "<$res_log")){ print LOG "$receive\n"; print LOG "$send\n"; close(LOG); }簡単に説明すると、ifconfig の出力は以下のとおり
cheddar:~# ifconfig eth1 eth1 Link encap:Ethernet HWaddr 00:40:26:CD:ED:F0 inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16180115 errors:0 dropped:0 overruns:0 frame:0 TX packets:20329148 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:2362545881 (2.2 GiB) TX bytes:801479972 (764.3 MiB) Interrupt:10 Base address:0xd800なので、予め"bytes"が含まれる行だけ出力するように grep に食わせておく(下から2行目だけ取得)
kMG[_]: k,M,G,T,Pこれで、カンマで区切られた左から、標準値,x1024の値,更にx1024の値…にそれぞれの文字がつくので、万事解決。
0-59/5 * * * * /usr/bin/mrtg /hoge/mrtg.cfg >/dev/null 2>&1もしくは、とゆーか複数の cfg に分ける場合は、MRTG を実行するコマンドをシェルにまとめて、そいつを cron に突っ込んでおいたほうがスマート。かも。
0-59/5 * * * * /root/resource/execmrtg.sh >/dev/null 2>&1みたいに。スクリプトの中身は
#!/bin/sh /root/resource/cpuact300.pl & /root/resource/cpuload.pl /root/resource/mem.pl /root/resource/byte.pl eth0 1500 1500 /root/resource/byte.pl eth1 150 150 /root/resource/disk-df.pl /dev/hda1 /root/resource/disk-df.pl /dev/hdb1 /root/resource/disk-df.pl /dev/hdd1 /root/resource/disk-du.pl /home /root/resource/disk-du.pl /var /root/resource/disk-du.pl /usr /root/resource/session.pl ssh sleep 20 /usr/bin/mrtg /root/resource/cfg/net.cfg /usr/bin/mrtg /root/resource/cfg/mem.cfg /usr/bin/mrtg /root/resource/cfg/cpu.cfg /usr/bin/mrtg /root/resource/cfg/disk.cfg /usr/bin/mrtg /root/resource/cfg/session.cfgの前に、ちゃんとグラフが生成されるかどーか、コマンドラインで実行して、動作を確認してから cron に設定しちゃいましょう