# 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 に設定しちゃいましょう