PRESSMAN*Tech

HTML5, CSS3からWordPress, AWS, Elasticsearchまで。プレスマンのスタッフが綴る技術ブログ。

mrtgでサーバーを監視しよう

弊社の使っているサーバーセンターは24時間有人監視していますし、例えばネットワーク負荷の状況が知りたければいつでも教えてくれます。
ただ、自分で確認できるようにしておくのも何かと必要ですので、MRTGの出番です。SNMPを可視化するツールで、これの使い方はググればいくらでも設定方法が出てきます。
そんなわけで、少し便利なTipsを書いておきます。

ネットワークトラフィックの値がおかしい

ネットワークトラフィックの状況をmrtgでグラフ化していているとある値を境におかしな状況が発生します。
例えば5分間隔でグラフを描画していれば110Mbit/sあたりでおかしくなります。
この理由は桁あふれしてしまっているからです。32bitの符号なし整数は
2^32 = 4294967296
まで数えることができます。これを4294967296byteとするとそれを5分= 300秒で割って8をかけると
4294967296 (byte) / 300 (s) * 8 ≒ 114532461 (bit/s) ≒ 109Mbit/s
つまり、109Mbit/sを越えて5分間毎秒毎秒トラフィックを積算し続けると2^32を超えてしまうわけです。
動画を扱ったり、アクセスがかなり多いサイトでないとなかなか越えることはないと思います。
弊社がホスティングしているサイトでも映画などの動画がメインのサイトくらいです。
しかし、超えてしまうサイトがあるわけなのでそのような場合は下記のようにちょろっと設定を変えるだけです。

Target[localhost_eth0]: #eth0:public@localhost:::::2

の様に:::::2を付け加えること。64bitで集計します。
当然64bitも桁あふれしますが、その前に回線速度がそんなに速くないというか桁あふれさせるのに必要な速度は

2^64 / 300 * 8 ≒ 437ペタbit/s

httpdプロセスの数を数えたい

ネットワークトラフィックも問題ですが、接続数が増えまくってもサーバーにアクセスしづらくなってしまいます。
そんなわけでmrtgを使ってhttpdのプロセス数も取得してしまいましょう。
まあ、プロセス数を数えるみたいなのでapacheのMPMにworkerを使ってたら意味無いですね。

httpdのプロセス数を取りたいときは
/etc/snmp/snmp.comに
proc httpd
を追加してsnmpdを再起動。そして以下のようにmrtg.cfgを設定する。
まあ、細かい設定は適宜お願いします。

Target[httpd]: .1.3.6.1.4.1.2021.2.1.5.1&.1.3.6.1.4.1.2021.2.1.5.1:public@localhost:
Options[httpd]: gauge, absolute, growright, nopercent, noinfo, integer
MaxBytes[httpd]: 512
AbsMax[httpd]:1500
Title[httpd]: Number of httpd
PageTop[httpd]:<h1> Number of httpd on WebServer</h1>
YLegend[httpd]: Number of httpd
ShortLegend[httpd]: プロセス
LegendI[httpd]:起動中のhttpd
LegendO[httpd]:起動中のhttpd

ある一定の値を超えたらメールで通知したい

mrtgはある値が一定の値を超えたり、下まわったりしたときにプログラムを起動できます。
そのときにMRTGは3つの引数を渡します。$router変数、閾値(ThreshMaxIやThreshMinIの値)、そして現在の値です。
Input,Outputで最大値最小値を設定したりあれこれできるのですが、ググればいくらでも設定例があるので調べてみてください。
ここでは設定例とPHPで書いたメール送信プログラムを書いておきます。

httpdのプロセス数が255を超えたら、httpd.phpというプログラムを動かす場合

mrtg.cfg

ThreshMaxI[httpd]:255
ThreshProgI[httpd]:/home/mrtg/httpd.php

PHPのプログラム

#!/usr/php5/bin/php
<?php
$list = array(
'hogehoge@pressman.ne.jp',
'piyopiyo@pressman.ne.jp'
);
$body = "httpdプロセス数が設定値を超えました。\n";
$body .= "設定されている値:" .$argv[2] . "\n";
$body .= "現在の値:" . $argv[3] . "\n\n";
$headers = "From: emergency@pressman.ne.jp";
foreach($list as $val){
mb_send_mail($val,'警告:mrtg',$body,$headers);
}

もち、phpのファイルには実行権限つけてmrtgがアクセスできるようにしてあげてください。

投稿者:taichi

taichi の紹介

何でもやりますが、一応プログラマです。
このエントリーをはてなブックマークに追加

私たちと一緒に働きませんか?

株式会社プレスマンでは、プログラミングが大好きな方、仕事を通してさらにスキルを磨きたい方を募集しています。まずは募集職種をご覧の上、お気軽にお問い合わせください。あなたとお会いできるのを楽しみにしています。

プレスマンの採用情報を見る →

コメントは受け付けていません。

▲ 先頭へ戻る