muninまわりの話

もう動かし始めて1年ぐらい経つのだけど、最近また構成を変えたのでリソース監視システムmuninの話を備忘録代わりに記録しておく。 muninはperlで書かれた監視システム debianではmuninという中央の集計システムと、監視対象側で動くmunin-nodeというパッケージに別れている。この2者はtcp/4949ポートで独自のテキストプロトコルで通信する。

munin

muninはcronから5分に一回起動し、データ収集とrrdへの反映(munin-update)、監視閾値の適用(munin-limit)、htmlの生成(munin-html)、グラフの生成(munin-graph)をやる。私の設定では後半2つはcronからは実行しない。 設定ファイルは /etc/munin/munin.conf にまとまっている。各種ファイルのあるディレクトリやrrdの出力先などはそのままで、以下の3行のみ追記した。

graph_strategy cgi
cgiurl_graph /cgi-bin/munin-cgi-graph
html_strategy cgi

意味としては、htmlとグラフの生成をcronからの実行時には行なわないという事と、htmlに表示するグラフのパスを変更するもの。

nginx

htmlの表示にはnginxを使った。標準のvhostの設定に以下を追記する。

        location /munin/static/ {
                alias /etc/munin/static/;
        }

        location /munin/ {
                fastcgi_split_path_info ^(/munin)(.*);
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_pass unix:/var/run/munin/fcgi-html.sock;
                include fastcgi_params;
        }
        location ^~ /cgi-bin/munin-cgi-graph/ {
                fastcgi_split_path_info ^(/cgi-bin/munin-cgi-graph)(.*);
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_pass unix:/var/run/munin/fcgi-graph.sock;
                include fastcgi_params;
        }

それぞれ、htmlから参照する静的なcssやロゴなどを/etc/munin/static以下を参照させるもの。2つめのブロックは/munin/以下のパスについてmunin-cgi-htmlへと渡すための設定。cgiとの間はunix domain socket経由のfcgi プロトコルで行なう。最後のブロックがグラフの画像生成をmunin-cgi-graphへ行なわせるためのもの。/cgi-bin/munin-cgi-graph以下へのアクセスをfcgiに投げる。 この設定ではもちろん、cgi自体はnginxとは独立して上げる必要があるので以下のような内容をシェルスクリプトなどに記述して実行する。

sudo spawn-fcgi -s /var/run/munin/fcgi-graph.sock -U www-data -u www-data -g www-data -F 1 /usr/lib/munin/cgi/munin-cgi-graph
sudo spawn-fcgi -s /var/run/munin/fcgi-html.sock -U www-data -u www-data -g munin -F 1 /usr/lib/munin/cgi/munin-cgi-html
start-fcgi

いずれもプロセスはひとつだけしか上げていないが、マルチプロセッサなどで余裕がある場合は複数上げることも可能です。

munin-node

主な設定は /etc/munin/muni-node.conf だが、これ自体はアクセス制限やタイムアウトプラグインのパターンぐらいしか書くことはない。 デーモンとして動作するので、設定変更は都度上げ直す必要があります。

munin-plugins

パッケージ名としてはmunin-plugins-coreやmunin-plugins-extra、munin-plugins-cなど どのpluginを使うかは/etc/munin/plugins/以下にシンボリックリンクを張ることで、有効にできる。pluginの中身はシェルスクリプトだったりするので見ればわかるが、configという引数で実行されたらどのようなグラフとして描画されたいかを答えたり、通常の結果は

user.value 558034
nice.value 394002
system.value 162008
idle.value 6494120
iowait.value 33914
irq.value 2
softirq.value 7757
steal.value 0
guest.value 0

みたいなラベルと数値のスペース区切りを行指向で返すだけでよい。 パッケージを入れるだけで多くのプラグインが自動的に配置されているが、追加でシンボリックリンクを張ることで項目を増やすこともできる。 シンボリックリンクの名前で監視対象を表現することもできる。例えばif_というプラグインをif_eth0とするとeth0についての監視項目となる。 シンボリックリンクの名前だけでは与えられない設定については/etc/munin/plugin-conf.d/munin-node.confに記述する。例えば監視対象がデータベースであったとき接続ユーザとパスワードが必要になるがそういう情報はここに記載する。[]をラベルとして実行ユーザやプラグインに渡す環境変数を書く。パスワードなどを書く関係上、rootとmuninグループでしか読めないようになっている。

munin-node-c

pluginがシェルスクリプトperlで書けのは楽だけど、単純な処理一つでも結構なCPU時間を食う。これは非力なnodeは辛い。 perlのlwpで書かれていたのをfurlに書き変えたりgolangにしたりチマチマ直していたのだが、munin-nodeと主要なpluginをCで再実装された方が居た。 もちろん完全互換ではないが、munin-nodeが何をやっているかはこちらの実装を読んだ方が速いかもしれない。