Gangliaをrrdcachedで爆速にする

Ganglia でシステムを監視する

監視対象の増加に伴いパフォーマンスに問題が出てきていたGangliaにrrdcachedを導入して問題解決を図ります。

はじめに

Github がダウンして Twitter トレンド入りした今日この頃、皆様いかがお過ごしですか。
※「Github落ちたんで帰っていい?」的な発言を見て、「分散リポジトリなんだから Github 落ちても仕事できるんじゃ?」 と思ったんですが、そうでもない?

先日から Ganglia 関連の記事を書いていますが、今回はパフォーマンス向上ネタです。
Gangliaでシステムモニタリング に書いたように Ganglia では RRD を利用しているのですが、監視対象が増加してくると、RRD の Read/Write 処理が問題になってくることが多いです。
弊社の場合監視対象が10台を超えたあたりから、パフォーマンスに問題が出始めました。
※HDDの世代が少々古く、I/Oパフォーマンスがそれほど高くなかった事も原因

この解決策としては RRD を格納するストレージを高パフォーマンスのものにする (SSD使うとか) 方法がありますが、システム構成や諸事情 (買ってもらえない等 ) によって実現が困難な場合もあると思います。

こういった場合、rrdcached を利用する事でパフォーマンスを改善できる可能性が高いです。
以下手順を示します。

環境

環境は以下になります。Gangliaでシステムモニタリング と同様です。

OS CentOS 6.7
Ganglia (gmond, gmetad) 3.7.2-2
ganglia-web 3.7.1-2

※他バージョンでも適用可能かと思われますが、rrdcached と連携する場合、Ganglia はversion 3.1.7 以降が必要です。

手順

状況確認

ちなみに RRD への Read/Write が原因でパフォーマンスに問題がでている場合、"I/O処理待ち" 状態になっているはずです。

Gangliaでシステムモニタリング と同様のインストール手順を行った場合、Ganglia-Server 自体もメトリックの収集対象になっているはずですが、I/O処理待ち状態が常態化すると cpu_wio の値は以下のようになります。

cpu_wio

※監視対象でない場合 vmstat や sar コマンドにてI/O待ち状態にあるか確認できます。

iotop による確認

I/O処理待ちである事が確認できた場合、どのプロセスのディスクI/Oによるものか辺りを付ける事ができればなお良いでしょう。
/proc/<PID>/io から I/O情報を取得/解析するといった方法もあるようですが、top コマンドのI/O版といれる iotop コマンドがあるので、これが利用可能であれば使ってみるのをお勧めします。

iotop の使い方に関しては iotopでLinuxのプロセス毎のディスクI/Oを監視する を参照して下さい。

インストール

rrdcached

rrdcached は バージョン 1.4 以降の rrdtool パッケージに含まれています。CentOS6 系の場合、yum のベースリポジトリに登録されているのは ( 記事執筆時点では ) 1.3系のため、rrdcached が利用できません。

rpmforge-extras で1.4.7が提供されているのでこれを利用します ( 以下作業をするにあたって、必要に応じて rpmforge-extras を有効にしてください )。

yum でインストールでも構いませんが、以下 rpm ファイルを取得してインストールする方法になります。

  1. 適当なディレクトリに移動し、必要となる rpm ファイルを取得します。
    # 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
    
  2. rpm コマンドを利用して rrdtool を更新します。

    ※新規でインストールする場合、適宜コマンドを変更して下さい。

    rpm -Uvh rrdtool-1.4.7-1.el6.rfx.x86_64.rpm  perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm
    
    が、私の環境では以下エラーが発生
    エラー: 依存性の欠如:
            libdbi.so.0()(64bit) は rrdtool-1.4.7-1.el6.rfx.x86_64 に必要とされています
            perl(Time::HiRes) は rrdtool-1.4.7-1.el6.rfx.x86_64 に必要とされています
            ruby は rrdtool-1.4.7-1.el6.rfx.x86_64 に必要とされています
    

    以下、足りていないライブラリを追加後、再度更新する事でインストールが行えました。

    # yum install libdbi perl-Time-HiRes ruby 
    

設定

rrdcached ( rrdtool ) を更新したら、設定を行います。
やる事は大体次のようになります。

  • RRD関連のパーミッションを変更し、gmetad, ganglia-web(apache+php)がrrdcached を利用できるようにする
  • gmetad が rrdcached を利用するように設定
  • ganglia-web が rrdcached を利用するように設定

ganglia を apache グループに追加する

# usermod -a -G apache ganglia

RRD の格納先のパーミッションを設定する

※格納先は変更していません ( yum でインストールした状態に同じ )

# chown -R ganglia:apache /var/lib/ganglia/rrds

rrdcached 設定

rrdcached の設定は /etc/sysconfig/rrdcached に記載されています。これを変更します。

# vi /etc/sysconfig/rrdcached

以下のように編集

# Settings for rrdcached
RRDCACHED_ADDRESS="unix:/var/rrdtool/rrdcached/rrdcached.sock"
RRDC_USER=ganglia

OPTIONS="-s apache -m 664 -l ${RRDCACHED_ADDRESS} -s apache -m 777 -P FLUSH,STATS,HELP -l unix:/var/rrdtool/rrdcached/rrdcached.limited.sock -b /var/lib/ganglia/rrds -B -w 1800 -z 1800 -f 3600"

RRDCACHED_ADDRESS には Ganglia(gmetad) と rrdcached が通信するためのソケットを指定します。
ここでは /var/rrdtool/rrdcached ディレクトリ下に作成しています。このディレクトリにも適当なパーミッションを設定して下さい。

# chown -R ganglia:apache /var/rrdtool/rrdcached

肝になるのはオプション指定かと思われます。
先に ganglia を apache グループに追加しましたが、ganglia(gmetad)、及び、apache の両方がアクセス可能となるようにrrdcached は apache グループで実行するように指定しています。

オプション
-sこれ以降に指定されるソケットのグループ
-mこれ以降に指定されるソケットのファイルパーミッション
-lソケットアドレス
-Pソケットにアサインされるパーミッション
-bベースディレクトリ
-B-b で指定したパス以外への書き込みを制限する
-w物理ディスクへの書き込み間隔(秒)。デフォルトは300
-z–w にランダムで追加されるディレイの最大値(秒)。多数の書き込みが同時に発生する事を防ぐ。-wで指定した値より大きくすべきではない。
-fキャッシュの検索タイムアウト値。manpageを読んだがよく判らない。3600位の大きな値で指定しろと書いてある。

参考: RRDtool - rrdcached

gmetad 設定

gmetad の起動スクリプト ( /etc/init.d/gmetad ) を覗くと RRDCACHED_ADDRESS をエクスポートしている箇所があります。勘が良い方はお気づきかもしれませんが、この値が設定されている場合 gmetad は rrdcached を利用するように動作します。

RRDCACHED_ADDRESS を設定します。Redhat 系の場合 /etc/sysconfig/rrdcached の場合と同様に /etc/sysconfig/gmetad を用意し、/etc/sysconfig/rrdcached で設定した値を設定すればよいと思われます。

私の場合は /etc/profile.d/ganglia.sh を用意し、ここで設定/エクスポートするようにしました。

# vi /etc/profile.d/ganglia.sh
以下内容で作成
RRDCACHED_ADDRESS="unix:/var/rrdtool/rrdcached/rrdcached.sock"
export RRDCACHED_ADDRESS

PC再起動で有効になりますが、即時適応したい場合

# source /etc/profile.d/ganglia.sh

環境変数に設定されたかは以下で確認できます。

# env | grep RRDCACHED_ADDRESS
RRDCACHED_ADDRESS=unix:/var/rrdtool/rrdcached/rrdcached.sock

ganglia-web設定

ganglia-web で rrdcached を利用する場合、conf_default.php の設定を変更します。

# vi /usr/share/ganglia/conf_default.php

以下の設定を編集します (抜粋)。

$conf['rrdcached_socket'] = "/var/rrdtool/rrdcached/rrdcached.sock";

サービス起動

以下サービスを(再)起動します。

rrdcached

# /etc/rc.d/init.d/rrdcached start
自動起動にする場合
# chkconfig rrdcached on

gmetad

# /etc/rc.d/init.d/gmetad restart

確認

各サービスを(再)起動したら、きちんと動作しているか確認します。
 

Ganglia-webによる確認

弊社環境では rrdcached を導入する事で GangliaサーバのI/O待ちをほぼ解消する事ができました。

ganglia cpu_wio

ありがちなトラブル

  • rrdcached 起動時にエラー
  • ganglia-webでグラフ表示が行われない

いずれの場合もパーミッションの設定に問題がある可能性が高いです。

トラブルシューティング法

  • オプションの指定に問題がないか確認
    タイプミスがないか確認しましょう。この記事自体がタイプミスしている可能性もあるので、man rrdcached で確認するか、上でリンクを張った manpage の記載を確認して下さい。
  • パーミッション指定に問題がないか確認
  • グループ指定に問題がないか確認
    当記事は ganglia を CentOS6 系に yum でインストールした場合の設定になっています。環境によって指定する値は適宜変更して下さい。
  • 問題を切り分けるために 最初は rrdcached のみ設定する
    ganglia-web の方は後から設定を変更する事も可能です。
    今回の手順ではRRDの格納場所は yum で ganglia を導入した場合の場所 ( /var/lib/ganglia/rrds ) から変更していないため、先ずはrrdcachedでデータ収集が正しく行われているか確認しましょう。
  • SELinux で弾かれてないか?
    ganglia-web がrrdcached にアクセスを行うには、SELinuxの設定を変更する必要があります。
    私の場合、audit2allow, semodule コマンドを利用して、ポリシーを作成/適用しましたが、一旦SELinux を解除してみてもいいかもしれません。

まとめ

私が rrdcached を導入した Ganglia 環境では、実際記事タイトルにあるように導入前比で爆速になりました。
Ganglia に限らず RRD (rrdtool) を利用していて I/Oパフォーマンスの問題が発生している場合、rrdcached 導入で解決するかもしれません。
※利用しているアプリケーションが rrdcached に対応しているかは要確認