【I/O対策】CentOS+Muninでrrdcachedを使う方法(yumでインストール)
先日の「さくらのVPS」のディスクレイテンシ対策で、自サーバの負荷状況を調べたところ、監視サービスの Munin が細かいディスクI/Oを発生させている事が分かりました。
とは言ってもこのサーバの監視対象は1台だけなので、負荷と言っても知れているのですが。
ただ、VPSやクラウドのディスクI/O低減は割と大切だと思うので、今後の事も考え、Munin の細かいディスクI/Oをキャッシュして時間軸で分散、シーケンシャルアクセスに変える「rrdcached」を、CentOS 6.5 に導入してみました。
見出し画像はその成果です。開発環境のためあまり数値は高くありませんが、ディスクのレイテンシが大きく改善しました。
監視対象台数が多いケースなら効果は高いかもしれません。
Muninのアップデート
古いバージョンの CentOS では、rrdcached 非対応バージョンの munin が入っている場合があります。その場合は epel 上の最新版へアップデートしておきます。(/etc/munin.confに rrdcached_socket の設定項目があるか確認)
# yum --enablerepo=epel update munin
僕が yum したバージョンは Munin 2.0.19 でした。
CentOS 6.5 のrrdtoolを更新
$ whereis rrdcached
で、rrdcached が無い場合は、rrdtool を最新化します。
現時点の base リポジトリ上の rrdtool は、rrdcached に対応していないバージョン 1.3.8 だったので、今回は reporforge(旧rpmforge)リポジトリを使用します。
以下のコマンドで、rpmforge-extras が登録されているか確認。
$ yum repolist all
無い場合は、次の方法で repoforge を追加します。
まず、以下のコマンドでいろいろ確認し、
$ cat /etc/redhat-release $ uname -a
それに合わせた適切なファイルをここ「Using RepoForge」から選んでインストール。例えば CentOS 6.5 / x86_64bit 版ならこんな感じ。
# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
その後、以下で、rrdtool のバージョンとインストール状況を確認。
# yum --enablerepo=rpmforge-extras info rrdtool
以下で、rrdtool をアップデート。今回は rrdtool 1.4.7 になりました。
# yum --enablerepo=rpmforge-extras update rrdtool Is this ok [y/N]: y
rrdcachedの設定
さて、やっと設定に入れます。まずは rrdcached の設定から。
/etc/sysconfig/rrdcached を以下の様に編集。
OPTIONS="-s rrdcached -m 664 -l unix:/var/rrdtool/rrdcached/rrdcached.sock -l 127.0.0.1 -b /var/rrdtool/rrdcached -F -j /var/rrdtool/rrdcached/rrdcached-journal -w 1800 -z 1800 -f 3600" RRDC_USER=rrdcached umask 002
各オプションの簡単な説明は以下。
- -s:UNIXソケットのグループ
- -m:UNIXソケットのパーミッション
- -l:バインドするアドレス
- -w:ディスクに書き出す間隔(秒)
- -z: –w に対して追加されるランダムのディレイ(秒)。同時に大量のキューが書き出される事を防ぐ
- -F:デーモン終了時にデータをフラッシュ
- -j:ジャーナルファイル。システムクラッシュ時のデータ保護に。
最後の umask は必須ではありませんが、ウチの権限ポリシー上入れているので、手順を追うなら必要です。というか、rrdcached の導入で一番面倒なのがこの権限周りだったり…。
以下で、ジャーナル用ディレクトリを作成。
# cd /var/rrdtool/rrdcached # mkdir rrdcached-journal # chown rrdcached:rrdcached ./rrdcached-journal
以下でサービスを起動。
# service rrdcached start
以下でサービスの自動起動を設定 ・確認。
# chkconfig rrdcached on # chkconfig --list rrdcached
rrdcached 絡みのログは、/var/log/messages で確認できます。
Munin側の権限の調整と設定
今回は、rrdcached を rrdcached ユーザーのまま稼働させ、munin 側のディレクトリで setgid するポリシーとするため、munin の権限を弄ります。
以下でサブグループを設定・確認。
# usermod -G munin rrdcached # usermod -G rrdcached munin $ id rrdcached $ id munin
以下で munin 関連ディレクトリに setgid を設定。ファイルにグループ書き込み権限を付与。
# cd /var/lib/munin # chmod g+s . # find ./ -type d -print0|xargs -0 chmod g+s # find ./ -group munin -print0|xargs -0 chmod g+rw
/usr/bin/munin-cron をエディタで編集し、munin-update 呼び出し前に以下を追記。
umask 002
権限周りの設定は以上です。権限関連は必ずしもこうする必要はありません。各自のポリシーに合わせて適宜変えてください。
ここからは munin 本来の設定です。
/etc/munin/munin.conf に以下の行を追記。
rrdcached_socket /var/rrdtool/rrdcached/rrdcached.sock
その後、以下で munin と rrdcached を再起動。
# service munin-node restart # service rrdcached restart
以上です。
munin のログは /var/log/munin に出力されます。グラフが出ない場合は、ここで原因追求しましょう。
ちなみに私の環境では、最後に rrdcached を restart をしないと、munin-update.log で rrd ファイルの Permission denied が発生していました。
あとがき
結局のところ、rrdtool と munin さえ最新版だったらこんなに苦労しなかったんじゃないか。という気もしますが、とりあえず、これでディスクIO、特に書き込み負荷の集中についてはかなり改善したと思っています。
特に、VPSやクラウドって、結局のところディスクI/Oの取り合い。あるいは、そこに金がかかる。みたいな本質があると思うので、こういう設定は割と大事かもしれません。
余談ですが、Munin 2.1.4 以降では SQL ベースになる。というアナウンスがあり、え?今回みたいな設定不要になるの?と思い、気になって見てみたところ、2.1.5 の munin.conf にもちゃんと rrdcached の設定は存在していました。どーなんでしょうか。詳細は不明です。
参考情報: