Munin の監視ノードが増えてくると、ストレージの IO がボトルネックになりがち。Munin によるランダムなファイルの読み書きが主な原因。改善するためには、 rrdcached と Munin を連携する方法が手軽で確実な方法です。Muninサーバの処理が重いなと思ったら、SSD など高速ストレージを導入する前に、まずは rrdcached の導入がおすすめです。
記事内容は、rrdcached のメリット(1台で300ノードまでの監視に対応)と、RHEL5 で導入したときの手順メモ、そして rrdcached の効果を知る為の rrdcached プラグインの導入方法です。
■rrdcached を何故使うのか?
Munin は収集データを RRD ファイルに格納し、グラフ描画時に再び参照します。このとき、ストレージに対する読み書き(IO)が増えます。
とりわけ、負荷になりがちなのは、データを書き込み( munin-update によって、ノードからデータを集めてきた時)と、データの読み込み(グラフを生成時)時。特に Munin のノードが増えると、一度に多くの munin-update が走り出すため、どうしてもそこそこ性能の良い高速なストレージが必要になりがちです。
そこで、Munin 2.0 でサポートした rrdcached と連携する方法を検討してみました。rrdcached は一定期間データを保持し、RRD ファイルへ書き込むタイミングを遅延させることが出来ます。rrdcached がファイルを書き込みタイミングを分散するので、IO を効果的に減らす事ができます。
私の環境では、rrdcached を使う事によって、1台のマシン( CPU Xeon 4core、メモリ 4GB、HDD SATA ) で約 300 ノードを監視することが出来るようになりました。
導入前は高く推移し続けた Load Average も、導入後は iowait の減少により低くなります。また、munin-update の処理がスムーズに進むため、同じノード数を監視している場合でも、比較的サーバの処理に余裕が生まれました。
■rrdcached導入手順 (1/3) rrdtool の入手
※RHEL5 を前提の手順となりますが、CentOS5 や RHEL6/CentOS6 でも、ほぼ同様の手順でセットアップできるのではと思います。適時置き換えてお読み下さい。
事前準備として rrdtool のパッケージのバージョンが古い場合 ( 1.2 系 ) は、1.4 系にバージョンアップします。rpm コマンドで一時的に削除しても構いませんが、必須ではありません(このとき yum erase rrdtool を実行してしまうと、Munin 本体毎削除してしまうので注意すること)。
# rpm -e rrdtool rrdtool-perl
rrdtool の 1.4 系は、EPEL や CentOS リポジトリのものはバージョンが古いため、rpmforge のパッケージを取得します。
RHEL5/CentOS5 (x86_64) $ wget http://pkgs.repoforge.org/rrdtool/rrdtool-1.4.7-1.el5.rf.x86_64.rpm $ wget http://pkgs.repoforge.org/rrdtool/perl-rrdtool-1.4.7-1.el5.rf.x86_64.rpm RHEL6/CentOS6 (x86_64) $ wget http://pkgs.repoforge.org/rrdtool/rrdtool-1.4.7-1.el6.rfx.x86_64.rpm $ wget http://pkgs.repoforge.org/rrdtool/perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm
ダウンロード後は、rpm コマンドでパッケージをインストールします。
# rpm -ivh ./rrdtool-1.4.7-1.el5.rf.x86_64.rpm ./perl-rrdtool-1.4.7-1.el5.rf.x86_64.rpm
※パッケージを削除しなかった場合は -ivh (インストール)の代わりに -Uvh (更新)を使います。
もし、次のようなエラーが出た場合は
警告: ./perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm: ヘッダ V3 DSA/SHA1 Signature, key ID 6b8d79e6: NOKEY エラー: 依存性の欠如: xorg-x11-fonts-Type1 は rrdtool-1.4.7-1.el6.rfx.x86_64 に必要とされています
パッケージの追加が必要です。yum install xorg-x11-fonts-Type1 を実行します。
RHLE5 では lua が必要になりますので、パッケージが足りなければ EPEL 経由で入れます。
# yum install lua --enablerepo=epel
ちなみに、環境によっては rrdtool の更新後、グラフの文字が出なくなる事がありました。グラフログを参照すると「failed to load /usr/share/rrdtool/fonts/DejaVuSansMono-Roman.ttf」と出ており、なぜかフォントが消失。他のサーバから対象サーバにファイルをコピーして復旧します。
■rrdcached導入手順 (2/3) rrdcached の初期設定と起動
次に rrdcached の起動設定を行います。/etc/sysconfig/rrdcached を編集します。
OPTIONS="-l unix:/var/rrdtool/rrdcached/rrdcached.sock -l 127.0.0.1 -s apache -m 664 -b /var/rrdtool/rrdcached -F -j /var/lib/munin/rrdcached-journal -w 1800 -z 1800 -f 3600" RRDC_USER=munin
- -l 127.0.0.1 は、コマンドラインで動作確認するためにソケットを開いています。
- -s は、グループ権限を apache に指定。
- -m はパーミッション
- -b は起動時のベースディレクトリ
- -F は rrdcached 再起動時、常に全データをフラッシュする
- -j はジャーナリング用ディレクトリの指定
- -w 1800 は、書き込みを 30 分遅延
- -z 1800 は、30分以内のランダムな時間で書き込む指定
- -f 3600 は、60分以内にデータをフラッシュする指定
- RRDC_USER=所有者権限を munin に指定
※このあたりのパラメータは、環境に応じて書き換えて下さい。-w -z -f オプションの指定が無いと、5分毎にデータを書き込む処理となり、rrdcached を入れる効果が減少します。なお、私は Munin サイトの wiki 記載パラメータをそのまま使っていますが、特に不具合は感じていません。
次に、起動スクリプトを編集し、所有者を変更する指定を入れます。
# vi /etc/init.d/rrdcached
27 start() { 28 [ -x $rrdcached ] || exit 5 29 echo -n $"Starting $prog: " 30 daemon --user=${RRDC_USER} $rrdcached -p ${pidfile} ${OPTIONS} 31 retval=$? 32 echo 33 [ $retval -eq 0 ] && touch $lockfile 34 chgrp apache /var/rrdtool/rrdcached/rrdcached.sock 35 chmod g+w /var/rrdtool/rrdcached/rrdcached.sock 36 return $retval 37 }
赤字の 34 行目、35行目を追加します。ソケットファイルのパーミッションを指定します。これが適切でないと、グラフを生成できなくなります。
それから、ジャーナリング用のディレクトリを作成します。
# mkdir /var/lib/munin/rrdcached-journal # chown munin.munin /var/lib/munin/rrdcached-journal
ベースディレクトリのパーミッションを指定します。
# chown munin.munin /var/rrdtool/rrdcached/
rrdcached の起動を試みます。
# /sbin/service rrdcached start
※エラー「rrdcached を起動中: bash: line 1: 3064 セグメンテーション違反です」が出る時は、ジャーナリング用のディレクトリが存在しない場合です。
※/var/log/messages に「[WARN] RRDCached feature ignored: rrdcached socket not writable」と出続ける場合はソケットのあるディレクトリの権限確認が必要です。
動作確認は、ポート 42217 (rrdcached が使用します) を開いているかどうかのチェックです。
# /usr/sbin/lsof -i:42217 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rrdcached 25428 munin 5u IPv4 26402007 0t0 TCP localhost:42217 (LISTEN)
正常にリッスンしていれば、コマンドラインから telnet や nc によって、統計情報コマンド STATS を実行する事が出来ます。
# nc localhost 42217 STATS 9 Statistics follow QueueLength: 0 UpdatesReceived: 0 FlushesReceived: 0 UpdatesWritten: 0 DataSetsWritten: 0 TreeNodesNumber: 0 TreeDepth: 0 JournalBytes: 0 JournalRotate: 0 quit
最後に、サーバのブート時に自動実行する設定にします。
# /sbin/chkconfig rrdcached on # /sbin/chkconfig --list rrdcached rrdcached 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ちなみに、正常起動すると /var/log/messages にもログを記録するようになります。
Jul 5 22:55:30 sv rrdcached[25428]: starting up Jul 5 22:55:30 sv rrdcached[25428]: checking for journal files Jul 5 22:55:30 sv rrdcached[25428]: journal processing complete Jul 5 22:55:30 sv rrdcached[25428]: listening for connections
■rrdcached導入手順 (3/3) Munin側の調整
ここまでたどり着けば、あとは一息です。munin の設定ファイル /etc/munin/munin.conf を開き、87 行目付近をコメントアウトします。先ほどの rrdcached が作成したソケットファイルのパスを指定します。
# RRD updates are per default, performed directly on the rrd files. # To reduce IO and enable the use of the rrdcached, uncomment it and set it to # the location of the socket that rrdcached uses. # rrdcached_socket /var/rrdtool/rrdcached/rrdcached.sock
以上で設定は完了です。グラフを動的な生成にしている場合、すぐに設定が有効になります。もし、グラフが正常に表示されない場合は、グラフ関連のログを確認してみてください。
■Munin の rrdcached プラグイン有効化方法
最後に、Munin のプラグインを有効化し、rrdcached の処理状況を視覚的に把握できるようにします。
プラグインを入れておくことで、rrdcached が扱っているデータ量がわかりやすくなります。また、グラフの挙動を通し、動作異常が起きていないかどうかの判断に使う事もできます。
プラグインはパッケージには標準添付されていません。github に配付されているファイルを元に展開します。
$ wget https://raw.github.com/munin-monitoring/munin/2.0.16/plugins/node.d.debug/rrdcached.in
ファイルを編集し、1行目のパスを書き換えます。
#!@@PERL@@
こちらを
#!/usr/bin/perl
このように修正します。
8行目では、次のようにソケットの変数を指定します。
my $PEER = exists $ENV{'PEER'} ? $ENV{'PEER'} : "/var/rrdtool/rrdcached/rrdcached.sock";
また、カテゴリが未指定なので 16 行目付近でカテゴリを追加しておくと、後でグラフを探しやすくなります。
15 if ($arg && $arg eq "config") { 16 print "graph_title rrdcached stats\n"; 17 print "graph_category rrdcached\n";
37行目付近の、ソケットの指定も書き換えます。
my $sock = new IO::Socket::UNIX( Type => SOCK_STREAM, Peer => $PEER, # Peer => "/tmp/rrdcached.munin.sock", ) or die "Cannot open socket : $!";
以上で編集は終わりです。
あとは、ファイルを設置します。
# mv rrdcached.in /usr/share/munin/plugins/rrdcached # chmod 755 /usr/share/munin/plugins/rrdcached # ln -s /usr/share/munin/plugins/rrdcached /etc/munin/plugins/
プラグイン向けの設定を /etc/munin/plugin-conf.d/munin-node に追加します。
[rrdcached] group apache env.PEER /var/rrdtool/rrdcached/rrdcached.sock
※group apache と指定しているのは、CGI で動的グラフを生成するようにしているため、ソケットファイルの所有者が apache になっているためです。
設置後は munin-run を使って動作テストをします。
# /usr/sbin/munin-run rrdcached QueueLength.value 0 UpdatesReceived.value 0 FlushesReceived.value 0 UpdatesWritten.value 0 DataSetsWritten.value 0 TreeNodesNumber.value 0 TreeDepth.value 0 JournalBytes.value 0 JournalRotate.value 0
※エラー “Cannot open socket : No such file or directory at /etc/munin/plugins/rrdcached line 32.” が出る時は、ソケットの所有者やパスを確認してください。
※rrdcached 切替後、CGI 経由でグラフが生成されない場合は /var/log/munin/munin-cgi-graph.log を参照してください。
プラグインを有効にするには munin-node を再起動します。
# /sbin/service munin-node restart
以上、rrdcached を使って IO を取り戻す、話しでした。
■参考
rrdcached – Munin
http://munin-monitoring.org/wiki/rrdcached
RRDtool – rrdcached
http://oss.oetiker.ch/rrdtool/doc/rrdcached.en.html
Scaling the munin master with rrdcached — Munin 2.1.2-53-gcdca5e1 documentation
https://munin.readthedocs.org/en/latest/master/rrdcached.html
lightning talk about rrdcached and munin
https://gist.github.com/ssm/5767967