ぶていのログでぶログ

思い出したが吉日

muninをちょっぱやにする方法

この記事は、Pepabo Advent Calendar 2014の14日目の記事です。 昨日は、 としやさんのマネージャーができるサービス監視 でした。

マネージャーがサービス監視をしていると、障害発生時の ヤバさ がすぐに伝わっていいですね!
過去に、障害時のオペレーションをしている時に役員の方々全員が仁王立ちしているなんてことがありました。。(ペパボ入社前の話です)


今年2月にペパボに入社して、もう年末なんて時の流れは早いですね。 去年の今頃はニートしつつ艦コレしつつあんちぽサンタをみつつ、 次の職場どうするかなぁ〜なんて考えてました。

そんな私も入社してからmuninばかりいじっていたら、社内ではmunin職人と呼ばれるようになりました(ドヤッ
今まで、muninネタを幾つか書いてきたのですが、今回はちょっぱやにする方法を書きたいと思います。
(※ なお、効果には個人差があります)

ちょっぱやにする方法

  1. munin 2.0系にする
  2. rrdcacheを使う
  3. CGI化&fastcgyi/fcgiを導入する

1. munin 2.0系にする

1.4系では、munin-updateがシリアル実行されていたため、かなり時間がかかっていました。 2.0系にアップデートすると、munin-updateが並行実行されるようになり時間の短縮が行えます。

また、後述するrrdcacheへの対応やCGIの導入も行えるので特に理由がない限り2.0系にアップデートした方がよいと思います。

嬉しい事に1.4系と2.0系のコンフィグには互換性があるので、アップデート後にコンフィグ変更等行わなくても そのまま動作します。
(一部Perlモジュールの依存が増えていますが、yumやaptがよしなにしてくれると思います)

2. rrdcacheを使う

muninが遅い原因の一つに rrdへの書き込み/読み込み があります。 数十台のノードを管理していると、munin-update時のrrdへの書き込みだけでDiskIOをすべて持っていかれる ということが、稀によく発生します。

これを回避するテクニックとして、 rrdファイルをtmpfs上に置いていました。 しかし、1つのファイルが数MBとはいえファイル数がそれなりにあり、全体では結構なファイルサイズになります。 またmuninのためだけに貴重なメモリリソースを食いつぶすのは勿体無いです。

しかし、rrdcacheを使うことでtmpfs上においた時と同程度の速度で、かつ、 メモリリソースの消費を抑えることができます。

rrdcacheとは

rrdcacheは、muninとrrdファイルの間に入り、書き込み/読み込み命令を一時的にキャッシュする アプリケーションです。 rrdへの書き込みはランダムIOが大量に発生し、それによりディスクレイテンシーが高まります。 rrdcacheはそれらをキャッシュし、シーケンシャルIOに変換してディスクに書き込みを行います。 これにより、IO負荷の軽減を行っています。

muninでは2.0系から、rrdcacheはrrdtool 1.4から使えるようになっています。

rrdcacheを使う

上述したとおり、rrdcahedはrrdtool 1.4以上が必要です。 パッケージアップデートをするか公式サイトからダウンロードしてきます。 幸い、rrdtool下位互換がありrrdtoolのバージョンに強烈に依存しているアプリも少なく、 気軽にアップデートすることができます。

インストール後の設定(RedHat系)

上述の公式からパッケージを入れた場合少し設定を変える必要があります。
(※ 私が設定を行ったのがRedHat系のディストリビューションであったため、他のディストリビューションでも この設定が必要かはわかりません)

デフォルトではrrdcacheユーザでrrdへのアクセスを試みますが、 munin側ではmuninユーザでrrdを作成しています。 新規にrrdを作成せずに、すでにあるrrdファイルを使うことが大半だと思うので、 rrdcachedの実行ユーザを変更しておきます。

 #
 # User service will run as
 #
-RRDCACHED_USER="rrdcache"
+RRDCACHED_USER="munin"

 #
 # To pass additional options, set OPTIONS here
 #
-OPTIONS="-w 300 -z 300"
+OPTIONS="-F -j /var/lib/munin/rrdcached-journal -w 1800 -z 1800 -f 3600"

 #
 # Socket permissions

OPTIONS変数の変更は必須ではないです。 このパラメータ変更は参考サイト*1のパラメータを何も考えずに採用しています。

munin.confの変更

rrdcacheの設定を変更し、rrdcachedを起動したらmunin.confを変更します。 先にrrdcachedを起動しておかないと、次回のmunin-cron実行時にエラー となってしまうので注意が必要です。

+rrdcached_socket /var/run/rrdcached/rrdcached.sock

注意点

rrdcachedを使用すると直接rrdファイルに書き込みを行わず、一旦ジャーナルファイルに書き出しされます。 そのため、たとえば、muninサーバを移設するみたいなことになりrrdファイルを移設する場合は、一旦ジャーナルファイルから rrdファイルへ書き出す(フラッシュ)必要があります。

デフォルトでは、ジャーナルからrrdへの書き込みは3600秒毎に行われます(-fオプションで指定)。 また、 -F オプションを追加することでrrdcachedが停止するタイミングで強制フラッシュすることもできます。

手動でフラッシュさせる場合は、rrdtool flushcached コマンドを指定します。

$ rrdtool flushcached --daemon unix:/var/run/rrdcached/rrdcached.sock /path/to/foo.rrd

3. CGI化&fastcgy/fcgiを導入する

rrdcacheを使うことでだいぶ改善されているとおもいます。 しかし、まだそれでもmunin-graphとmunin-htmlの処理が非常に重いです。

そこで、これら2つをCGI化しアクセス毎に動的に生成することで負荷を減らします。 また、mod_fastcgi/fcgiを導入することで生成されたグラフやHTMLをキャッシュすることで さらなる負荷軽減を図ります。

mod_fasstcgiのインストール

私の環境では、mod_fcgiがコアダンプを吐いて勝手に落ちてしまうという謎の現象が発生してしまったため、 mod_fastcgiを使っています。 確認はとれていませんが、どちらを使っても動作すると思います。

$ sudo yum install mod_fastcgi

設定変更

muninのCGI設定例 を参考に以下のような設定を追加します。

$ cat /etc/httpd/conf.d/munin.conf

# Static files
RewriteRule ^/munin/favicon.ico /var/www/html/munin/static/favicon.ico [L]
RewriteRule ^/munin/static/(.*) /var/www/html/munin/static/$1          [L]

# HTML
Alias /munin /var/www/html/munin
RewriteRule ^/munin/(.*\.html)?$           /munin-cgi/munin-cgi-html/$1 [PT]

# Images
RewriteRule ^/munin-cgi/munin-cgi-graph/(.*) /munin/$1
RewriteCond %{REQUEST_URI}                 !^/munin/static
RewriteRule ^/munin/(.*.png)$  /munin-cgi/munin-cgi-graph/$1 [L,PT]

<Location /munin>
    Order deny,allow
    Deny from all
    Allow from ~~~
</Location>

ScriptAlias /munin-cgi/munin-cgi-graph /var/www/cgi-bin/munin-cgi-graph
<Location /munin-cgi/munin-cgi-graph>
    Options +ExecCGI
    <IfModule mod_fcgid.c>
        SetHandler fcgid-script
    </IfModule>
    <IfModule mod_fastcgi.c>
        SetHandler fastcgi-script
    </IfModule>
    <IfModule !mod_fastcgi.c>
        <IfModule !mod_fcgid.c>
            SetHandler cgi-script
        </IfModule>
    </IfModule>
</Location>
ScriptAlias /munin-cgi/munin-cgi-html /var/www/cgi-bin/munin-cgi-html
<Location /munin-cgi/munin-cgi-html>
    Options +ExecCGI
    <IfModule mod_fcgid.c>
        SetHandler fcgid-script
    </IfModule>
    <IfModule mod_fastcgi.c>
        SetHandler fastcgi-script
    </IfModule>
    <IfModule !mod_fastcgi.c>
        <IfModule !mod_fcgid.c>
            SetHandler cgi-script
        </IfModule>
    </IfModule>
</Location>

また、munin.conf側も変更します。

+graph_strategy cgi
+html_strategy cgi

設定変更後にApacheを再起動すればCGI化していると思います。

(おまけ)CGIモードのデバッグ

CGI化したら画像がでない!などのトラブルが発生すると思います。 その時のデバッグ方法を簡単に書いておきます。

Apacheのログ/mod_rewriteのログを確認する

Apacheのコンフィグに以下ようなの設定を追加し、mod_rewriteのログを確認します。 変なrewriteルールが適用されていないか確認します。

RewriteEngine On
RewriteLog /var/log/httpd/rewrite_log
RewriteLogLevel 3
munin-cgi-graphをコマンドラインから叩く

グラフが正常に表示されない場合、 CGI_DEBUG環境変数を設定してmunin-cgi-graphを コマンドから直接叩くことで問題の切り分けを行うことができます。

以下はコマンド例です。

$ sudo -u munin \
> CGI_DEBUG=yes \
> PATH_INFO=/example.org/client.example.org/irqstats-day.png \
> /usr/lib/munin/cgi/munin-cgi-graph 2>&1 >/dev/null | less

まとめ

以上がmuninをちょっぱや(※個人のry)にする方法でした。 muninは用意されているpluginが多く取得できるメトリックが最初から多いのが利点です。 また、カスタマイズもしやすいので個人的にいじりがいのあるプロダクトだと思います。

2.1では、SQLをバックエンドに使ったりプラグインの刷新が行われているようなので楽しみですね!

参考