uzullaがブログ

uzullaがブログです。

ご予算がないのでmrtgでWindowsの資源監視をする

引き続きWindowsのネタで恐縮ですが、サーバの資源監視をしなければならないことになりました。
Linuxだと豊富にツールがあるですが、イマドキWindowsだとどうするのが鉄板なんですかね?


「Windowsの資源監視どうやってやるんだよ、パフォーマンスカウンタとか超つかいづらい」ってかいたら怒られそうなのですが、パフォーマンスカウンタで常時値を撮り続けるのは、ちょっと調べた限りCSV出力orバイナリ出力(パフォーマンスカウンタで開ける)しかないようで、これはあつかいづらい…。


で、ググってみたのですが、あまり存在しない。
正しく言えば、お高いよくできた製品はポロポロ有るのですが、簡単なやつでよくて、タダでやりたきゃFOSSのMrtgとかつかえ、という感じの模様です。


10台までなら、
http://www.paessler.com/prtg
というのが使えそうです。
いい感じですが、私はCPUとメモリとDiskとトラヒックが取れれば十分なので、大げさ感有る。


本当は月でお金払ってCupperEggとかの監視ASPで、外部からの死活監視を強化しつつ〜とかいいたかったのですが、どうも予算がおりない雰囲気がムンムンなので、とりあえずMrtgを入れる事にしました。

mrtgとは

特に説明不要だとおもうのですが、SNMPで値をとってきて、エンドレスにグラフ化するツールです。継続的なグラフツールの鉄板でしょう。
台数が増えると辛い感じですが、まあ両手両足くらいの台数ならいける。

静的なHTMLや画像を書き出すので、既存環境との住み分けにあまり気を使わなくて良いのもいいですね(サーバ立ってしまうと、ポートが…IPが…セキュリティが…となってしまうので)

Strawberry Perlで動かす

mrtgPerlで動きます。とりあえずperlをいれましょう。
Active Perlでもよいのですが、最近は苺がはやりらしいので、StrawberryPerlを入れます。


普通に
http://strawberryperl.com/
から拾ってきて入れても良いのですが、個人的には最近WindowsのバイナリはできるだけChocolateyでいれるようにしているので、そちらで入れます。

cmdから、

cinst StrawberryPerl

で、一発で入りますし、パスも通ります。


Chocolatey自体の入れ方は、過去に記事をかいたので、こちらをどうぞ
http://uzulla.hateblo.jp/entry/2013/05/15/134448

mrtgを入れる

mrtgもChocorateyでいられればよかったのですけど、なかったのでしかたないですね。

mrtgをダウンロード
http://oss.oetiker.ch/mrtg/
http://oss.oetiker.ch/mrtg/pub/?M=D
今回mrtg-2.17.4をDLしました。

DLしたzipはc:\mrtgに解凍しました。

前段のCinstでperlにはパスが通っているので
cd c:\mrtg\bin
perl mrtg
で、とりあえず実行できるはずです*1、できなかったら戻って見直しです。

ターゲットWindowsのSNMPサービスを設定

「コンピューターの管理」(コンピューターを右クリックして、「管理」)の中のサービス一覧を起動して、SNMP Serviceのプロパティを開きます。

「セキュリティタブ>受け付けるコミュニティ」に、今回は public を追加します。READ ONLYでOKです。
許可ホストは必要に応じて変更してください、mrtgを動かすサーバのIPになります。

保存したら、一応SNMP Serviceをリスタートしておきます(必要かは不明)

mrtg.cfgを作る

ワークディレクトリを作る

今回はc:\mrtg\htmlを各種ファイルの出力先と仮定して以下すすめます。inetpub以下に作りたいとか、そういう人は読み替えてください。

ディレクトリを作成した後、そのディレクトリに移動して

perl c:\mrtg\bin\cfgmaker public@127.0.0.1 --global "WorkDir: c:\mrtg\html" --output mrtg.cfg

と実行とすると、ネットワーク周りのコンフィグが自動生成されます。

ただ、最近のWindowsだと、すげぇ〜大量にIFが生成されるので、いらないものを消しましょう。
127.0.0.1などとあるやつは、いらないやつでしょう。実際に使われているIPのものだけを残しましょう。

とりあえず、動かす

perl c:\mrtg\bin\mrtg c:\mrtg\html\mrtg.cfg

などと実行してみましょう。
最初の起動では、かならずエラーのようなメッセージが出ます。

3回くらい実行すると、運が良ければエラーがでなくなります。
何回やってもエラーが出る場合、
mrtg+StrawberryPerlの相性かもしれない > 本エントリの後半を見てください
mrtg.cfgのいらんところを消してしまった > コンフィグ生成からやり直してください
snmp サービスが起動していない > 後述のGetifで試してみましょう
このあたりが典型でしょうか。

実行するとワークディレクトリにhtmlと画像ができます、
適当なものをひらいてみると、それっぽいページができているはずです、おめでとうございます!


ただ、まだグラフになっていないと思います、mrtgはしばらく(20分くらい)うごかさないと、グラフが有意になりません。
mrtgは5分に一度起動する必要があるのですが(後述)、ここではとりあえず

RunAsDaemon: yes
Interval:5

とconfigにかいておけば、デーモンモードでmrtgが起動するので、起動しっぱなしにしてまってみましょう。デーモンモードの終了はCtrl+Cです。


また、手元のWindowsだと、前述したとおり大量のいらないネットワークが追加されてしまいます。
実際に監視したい物以外をconfigから削除して、ワークディレクトリのmrtg.cfg以外を削除して再度取得しなおせばそのあたりを消せます。

CPUやDisk、Memoryの監視も含める

自分が昔mrtgをWindowsで動かした時は、WindowsのデフォルトのSNMPはCPUとかMemoryとかをSNMPでとれなかったのですが、
今のWindowsでもどうやらまだとれないみたいなので拡張を入れます

http://www.snmp-informant.com/
今回はinformant-std-16.zipをいれました。

これをいれることで、WindowsのSNMPが拡張されます。

getifをいれる(なくても可だが、つらい)

windowsだとsnmp walker*2的なものがないので、これも定番ですが、Getifをいれます。
http://www.snmp4tpc.com/getif.htm
今回2.3.1をいれました。


GetIfで、前段でいれた拡張MIBをチェックするために

C:\Program Files\SNMP Informant\standard\mibs\SMIv2

の中の

INFORMANT-STD.MIB
WTCS.MIB

2つのMIBファイルを

c:\program files\getif 2.3.1\Mibs

へコピーしておきましょう。すると、Getifで拡張された.1.3.6.1.4.1以下が展開できるようになります。

GetIfを起動します

普通にスタートメニューから起動ですが、Windows Vista以降でGetIfを実行するときには、

DllRegisterServer (msflxgrd) failed

などというエラーが出ますが、これはアイコンを右クリックして、管理者権限で実行してください。

とりあえずホスト情報を引いてみる

GetIfを起動して、Parametersタブの、Hostnameに対象のIPをいれてウインドウ下部のStartを押すとざっとデータを読んでくれます。
諸々なんとなくそれっぽい値がでれば、SNMPからデータを引くことに成功しています。
成功しない場合は、SNMPサービス設定や、FWの設定などが悪いので確認しましょう。

必要なMIBを探す

SNMPではMIBというドット区切りの数字(例:.1.3.6.1.4.1.9600.1.1.1.1.5.2.67.58)みたいなものをつかって必要な情報を惹きます。
このMIBを探すのにGetIFのMBrowserタブを使います。

使い方がかなりわかりづらいんですが、とりあえずParameterでホスト名でIPをいれて、StartしたあとにMBrowserタブをひらきます。
中央にツリービューがありますが、これをぺちぺちと開いていきます。
もしお目当てのMIBがわかっていれば、ツリービュー上部の入力欄で一発で飛べます。

ためしにCPUの情報をひきます。ツリービューを
.iso.org.dod.internet.private.enterprises.wtcs.informant.standard.processorTable.processorEntry
とひらいていってください。
そこまで選ぶとcpuPercentProcessorTimeというアイテムがあるので、それを選びます。

選択後、「SET」というボタンの左にある入力欄にカーソルを合わせてEnterすると、実際に取得できるMIBリストがツリービュー下のエリアに表示されます。
パラメタの値(:の右)をみながら、それっぽいものを探し、必要なものをクリックすると、一番左下のフィールドに取得MIB文字列が出ます。
これがmrtgに指定するMIBです。

あとは適当にツリービューをウロウロして、ほしい情報を探しましょう。

Getifのグラフ機能

ちなみに、MIBリストを選択したときに、右下のAddGraphボタンを押すと、Graphタブ内にその要素が追加されます。
ためしにProcesserTime(.1.3.6.1.4.1.9600.1.1.5.1.5.1.48など)を追加して、Graphタブをひらき、Refr. time(リフレッシュレート)を1にして、Enterを押すとデータが更新され始めます。

MIBが長すぎると、ゲージの値がでないので、Legendのチェックをはずすとよいでしょう。
どうでしょうグラフがでましたかね、感動ですね。
CPU負荷なら、ウインドウをグルグル回したりすれば、グラフがうごくのがわかると思います。


GetIF、この1秒単位でグラフをみれるのわりと便利なんですよね、Macでも同じ事ができるやつほしい。

というところで、

さて、といったところでとりあえず私がほしかったのは以下みたいなあたりでした。
環境がかわったり、バージョンがかわったりでこのMIBは変わるかもしれません、注意しましょう

.1.3.6.1.4.1.9600.1.1.5.1.5.1.48 Processor Time
.1.3.6.1.4.1.9600.1.1.1.1.5.2.67.58 空き Disk容量 (Cドライブ) Mbyte
.1.3.6.1.4.1.9600.1.1.2.1.0 空きメモリ(byte)

mtrgのコンフィグに追記する

解説めんどいのでテンプレです。

CPUはこちら

Target[cpu]: .1.3.6.1.4.1.9600.1.1.5.1.5.1.48&.1.3.6.1.4.1.9600.1.1.5.1.5.1.48:public@127.0.0.1:
MaxBytes[cpu]: 100
Options[cpu]: gauge,absolute,
ShortLegend[cpu]: %
Unscaled[cpu]: ymwd
Title[cpu]: CPU
YLegend[cpu]: CPU
PageTop[cpu]: <h1>CPU</h1>

メモリはこちら、MaxBytesは、システムに搭載されたメモリ量(byte)に書き換えましょう

Target[memory]: .1.3.6.1.4.1.9600.1.1.2.1.0&.1.3.6.1.4.1.9600.1.1.2.1.0:public@127.0.0.1:
MaxBytes[memory]: 1000000000
Options[memory]: gauge,absolute,
ShortLegend[memory]: kbytes
Unscaled[memory]: ymwd
Title[memory]: memory
YLegend[memory]: memory
PageTop[memory]: <h1>memory</h1>

Diskはこちら、メモリ同様に空きを調整しましょう。

Target[disk]: .1.3.6.1.4.1.9600.1.1.1.1.5.2.67.58&.1.3.6.1.4.1.9600.1.1.1.1.5.2.67.58:public@127.0.0.1:
MaxBytes[disk]: 100000000000
Options[disk]: gauge,absolute,
ShortLegend[disk]: bytes
Unscaled[disk]: ymwd
Title[disk]: disk
YLegend[disk]: disk
PageTop[disk]: <h1>disk</h1>

mrtgをまた20分ばかりはしらせればグラフができてます、どうですかね?うまくいきましたでしょうか?

思ったようなグラフがでない場合には調整が必要です。mrtgのオプションは山ほどあってわかりづらいですが、がんばりましょう。
本家のドキュメントをあたるべきですが、日本語じゃないとつらい人は
http://tech.bayashi.net/svr/doc/mrtg.html
こちらのページなどオプションの一覧としては参考になります。

mrtgを走らせ続ける

起動時に自動起動されるようにタスクスケジューラに登録しましょう。
個人的にはデーモンモードは好きではありませんが(死んだ時にきづけないので)、イベントがタスク結果でうまるのがクソうざいのでしかたないのでWindowsではデーモンモードで動かす人が多そうです。


タスクスケジューラの設定のやり方ですが、めんどいので
http://www.ipentec.com/document/document.aspx?page=windows-mrtg-install
こちらを見てください。


トリガーはコンピューターの起動時、
操作はプログラムの開始で、
プログラム・スクリプトにはPerlのパスを
C:\strawberry\perl\bin\perl.exe
引数には以下を
c:\mrtg\bin\mrtg c:\mrtg\html\mrtg.cfg
開始(オプション)は実行時カレントディレクトリになりますので(いらないはずですが)
c:\mrtg\html
を指定しておきましょう

あとは再起動してみましょう。


私もそうですが、デーモンモードでなく、タスクスケジューラで5分毎に実行するようにするには
http://open-net.info/blog/?p=1851
こちらが参考になります。
RunAsDaemon: yes
Interval:5
をけした上で、タスクを5分毎に設定してください。


以上です!

まっとうなWindows的には

FOSSとか使わないで、純正ツールや私の知らないイケてるツールを使うべきだと思うのですが、前述のとおり鉄板がわかりませんでした、もしご存知の方がいらっしゃいましたらば、是非お教え下さい。


また、mrtgはグラフが作れるだけでいかんせん低機能なので、ご予算や工数をかけてよい人は、Zabbixや、MuninやCactiをつかうべきでしょう、SNMPの設定自体は本エントリも役立つとおもいますが、Zabbixはサーバにいれるエージェントもちゃんとあったはずなので、私は今回採用しませんでしたが、オススメです。


おまけのお役立ち情報

index.htmlをつくる

indexmakerでつくれます

c:\mrtg\html>perl ..\bin\indexmaker mrtg.cfg --output=index.html

mrtg.cfgに書かれたグラフがindex.htmlに並びます。
お好みで --columns=1 もどうぞ。


mrtg+Strawberry Perlでエラーがでる件

Subroutine SNMP_Session::pack_sockaddr_in6 redefined

などというエラーです。

解決のために、mrtg2\lib\SNMP_Sesison.pmを修正しました。(まったく同じものが、二箇所あります)

        #Socket6->import(qw(pack_sockaddr_in6 inet_pton getaddrinfo unpack_sockaddr_in6));
        Socket6->import(qw(inet_pton getaddrinfo)); 

たまにハマるエラー

DiskとかMemoryとかCPUとか、グラフがひとつしかない要素を書くと、たまにやってしまうエラーですが

SNMP Error:
Received SNMP response with error code
  error status: noSuchName
  index 1 (OID: 1.3.6.1.2.1.2.2.1.10.48)
SNMPv1_Session (remote host: "127.0.0.1" [127.0.0.1].161)
                  community: "public"
                 request ID: 2045272074
                PDU bufsize: 8000 bytes
                    timeout: 2s
                    retries: 5
                    backoff: 1)
 at c:/mrtg/bin\..\lib\mrtg2/SNMP_util.pm line 497.
SNMPGET Problem for ifInOctets.48 ifOutOctets.48 sysUptime sysName on public@127
.0.0.1::::::v4only
 at c:\mrtg\bin\mrtg line 2330.
2013-08-21 03:03:38: ERROR: Target[cpu][_IN_] '.1.3.6.1.4.1.9600.1.1.5.1.5.1. $t
arget->[1]{$mode} ' (warn): Use of uninitialized value in concatenation (.) or s
tring at (eval 17) line 1.
2013-08-21 03:03:38: ERROR: Target[cpu][_OUT_] '.1.3.6.1.4.1.9600.1.1.5.1.5.1. $
target->[1]{$mode} ' (warn): Use of uninitialized value in concatenation (.) or
string at (eval 18) line 1.

こんな感じのエラーが出ます。

これは、Targetが指定ミスです。たとえばこう書いてしまうと、エラーが出ます。

Target[disk]: .1.3.6.1.4.1.9600.1.1.1.1.20.2.67.58:public@127.0.0.1:

正しくは

Target[disk]: .1.3.6.1.4.1.9600.1.1.1.1.20.2.67.58&.1.3.6.1.4.1.9600.1.1.1.1.20.2.67.58:public@127.0.0.1:

こうですね、グラフが1つしかない時でも、ダミー的に2つMIBを指定しましょう

*1:cmdをひらきなおさないと、PATH環境変数が有効になっていないかもしれません

*2:SNMPの値を探したり、取得してみたり