【Munin】rrdcachedでIOを取り戻せ!

【Munin】rrdcachedでIOを取り戻せ! はてなブックマーク - 【Munin】rrdcachedでIOを取り戻せ!


Munin の監視ノードが増えてくると、ストレージの IO がボトルネックになりがち。Munin によるランダムなファイルの読み書きが主な原因。改善するためには、 rrdcached と Munin を連携する方法が手軽で確実な方法です。Muninサーバの処理が重いなと思ったら、SSD など高速ストレージを導入する前に、まずは rrdcached の導入がおすすめです。

記事内容は、rrdcached のメリット(1台で300ノードまでの監視に対応)と、RHEL5 で導入したときの手順メモ、そして rrdcached の効果を知る為の rrdcached プラグインの導入方法です。

■rrdcached を何故使うのか?

rrdcached 導入後はIO(write)が一気に減少

Munin は収集データを RRD ファイルに格納し、グラフ描画時に再び参照します。このとき、ストレージに対する読み書き(IO)が増えます。

とりわけ、負荷になりがちなのは、データを書き込み( munin-update によって、ノードからデータを集めてきた時)と、データの読み込み(グラフを生成時)時。特に Munin のノードが増えると、一度に多くの munin-update が走り出すため、どうしてもそこそこ性能の良い高速なストレージが必要になりがちです。

CPUのiowaitも減少します。

そこで、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 プラグイン有効化方法

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