純規の暇人趣味ブログ

首を突っ込んで足を洗う

Ubuntu(またはRaspbian)のMuninでrrdcachedを使う

      2016/05/25    HimaJyun

僕の管理するサーバはMuninでリソース監視をしています。

今回、MuninをRaspberryPi上に移動させることにしたのですが、IO負荷軽減のためにrrdcachedを利用しました。

調べてみると日本語の情報はRHEL系が殆どでDebian系の情報が無かったため記事にしてみます。

rrdcachedを使う

Muninは監視してきた(1プラグイン辺り日/週/月/年の4つの)データをばらばらのファイルで書き込みます、するとどうなるかと言うと、ランダムアクセスのバーゲンセールになってディスクIOを持って行かれます。

それが5分置きに発生するので、(SDカードが主のため)IOの弱いRaspberry Piなどでこれを利用するのは自殺行為に等しいです。(実際に動かしてみるとうんともすんとも言わなくなりましたし)

そこで、rrdcachedを利用して、しばらくの間キャッシュする事でIO負荷がとても減らせます、と言うのはこのページをご覧であれば既にご存知の情報だと思われます。

前提条件

以下の様な環境で試します。

  • Ubuntu 16.04、またはRaspbian(14.04の場合はRaspbianと同じ設定です)
  • Muninはインストール済み
  • WebサーバはApache2
  • グラフはCGIで描画

良くある「重いからCGIにしたけどrrdcachedが分からない」状況ですね。

確認はしていませんが、Debianでも行けるかと思われます。

rrdcachedを設定する

と言っても、多少のハマりポイントがあるだけで、ほぼそのまま動かせます。

インストール

当たり前ですね、rrdcachedを使うのですからrrdcachedをインストールする必要があります、そんな事はイカもタコも猫も杓子も理解しているはずです。

普通にaptでインストール出来ます。

test@TestServer:~$ sudo apt-get install rrdcached
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています 
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
 rrdcached
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 14 個。
58.5 kB のアーカイブを取得する必要があります。
この操作後に追加で 193 kB のディスク容量が消費されます。

設定を変更する(Raspbian)

rrdcachedの設定ファイルは「/etc/default/rrdcached」にあります、Ubuntu 16.04では多少の変更があるので少々設定方法が異なります。

まずはRaspbianやUbuntu 14.04などの従来のrrdcachedの場合です。

ファイル内に「OPTS」と言う物があるのでそれを以下のように設定します。

OPTS="-f 3600 -F -w 1800 -z 1800 -b /var/lib/rrdcached/db/ -j /var/lib/rrdcached/journal/ -p /var/run/rrdcached.pid -s www-data -l unix:/var/run/rrdcached.sock"

-fや-w、-zに関しては後で説明しますが、だいたいこれで良いかと思います。

設定を変更する(Ubuntu 16.04)

rrdcachedの設定ファイルが「/etc/default/rrdcached」なのは変わりませんが、Ubuntu 16.04では引数が個別の変数に分かれており、しかもトラップが潜んでいます。

実際に変更する必要がある項目だけを抜き出してみます。

#WRITE_TIMEOUT=300
#WRITE_JITTER=0
#SOCKGROUP=root
BASE_OPTIONS="-B"

デフォルトの設定で「BASE_PATH」は「/var/lib/rrdcached/db」、「JOURNAL_PATH」は「/var/lib/rrdcached/journal/」に、pidやsockのパスも「/var/rub/rrdcached.(pid|sock)」なっていると思うので変更する必要はありません。

「WRITE_TIMEOUT」は従来型の設定で言う「-w」オプションに当たる物です、アンコメントして好きな値を設定して下さい。

「WRITE_JITTER」は従来型の設定で言う「-z」オプションに当たる物です、アンコメントして好きな値を……

「SOCKGROUP」はソケットファイルのグループです、ここではグラフがCGIで動作しているため、「www-data」を指定します。

「BASE_OPTIONS」はその他のオプションを指定する項目です、「-f」オプションや「-F」はこちらに設定しましょう(fとFは別物です)

この「BASE_OPTIONS」に最初から指定されている「-B」オプションが曲者でして、これが存在すると多くの場合はMuninが権限エラーになります、ですので-Bオプションは排除して下さい。

すなわち、以下のようになる訳です。

WRITE_TIMEOUT=1800
WRITE_JITTER=1800
SOCKGROUP=www-data
BASE_OPTIONS="-F -f 3600"

引数の説明

いくつかの引数が登場しました、その中でも「-f/-F/-w/-z」はキャッシュに関する設定なので説明しましょう。

-w(WRITE_TIMEOUT):書き込みの遅延時間(要はどれくらいキャッシュするか)です、「1800」が一般的な設定だと思われます、1800だと30分間のデータをキャッシュします。

-z(WRITE_JITTER):書き込みを「-wの値+(0~この値)」の分だけずらします、すなわち、「-w 1800」「-z 1800」なら、1800~3600秒の間で書き込みを行います、タイミングをずらす事で同時に大量の書き込みが発生しない様にします、-wより大きくしない方が良いらしいです。

-f:この時間が経過すると「-w」云々関係無しに全てのデータを書き込む設定……だと思います、停電などでのデータ損失を防ぐ目的だと思われます、あまり小さな値だと要らない負荷が出るので大きめの値にするのがおススメです(-wの値+-zの値以上にした方が良いです、UPSなどがあって停電しない自信があるなら設定しなくても大丈夫でしょう)

-F:デーモンの終了時(再起動やシャットダウン)にデータを全て書き込む設定です、指定しておいて困る事はないので指定した方が良いでしょう。

-B:Ubuntu 16.04の設定でのみ登場するこいつ、これが指定されていると「JOURNAL_PATH」が「BASE_PATH」より上位のディレクトリだと書き込まない様にするセキュリティ用の設定らしいです、所謂chroot的な物

つまりどういう事かと言うと、「BASE_PATH」の設定が「/hoge」なら「JOURNAL_PATH」が/hoge以下(/hoge/fugaや/hoge/piyo)でないと動作しません

でもって、デフォルト設定では「JOURNAL_PATH」は「BASE_PATH」より上位(同じ階層)に設定されています、どういう事かと言うと、デフォルト設定では絶対に動かないのです、この項目は指定する意味がありません、排除しましょう。

グループにユーザを追加

とてもとてもとてもとても古いrrdcachedだと「rrdcached」ユーザが存在したらしいですが、少なくとも今は存在せず、rootで動作します。

そのために「-s(SOCKGROUP)」を指定するのですが、muninだとwww-dataが、www-dataだとmuninが読み書き出来なくなります、つまり、cgiの際にどちらかに合わせると反対側が困る訳です。

そんな場合は、書き込めない側のユーザをグループに追加、今回は「www-data」を設定しているので「munin」グループに追加すればいいのです。

が、権限周りがややこしくなるのでお互いをお互いのグループに追加しておくと楽でしょう。

sudo gpasswd -a munin www-data
sudo gpasswd -a www-data munin

Muninの設定を変更

Muninの設定(/etc/munin/munin.conf)に「rrdcached_socket」と言う設定項目があります、ここに、先程設定したsockファイルのパス(多くの場合は「/var/run/rrdcached.sock」)を設定するのです、迷うほどの物でもありませんね。

rrdcached_socket /var/run/rrdcached.sock

設定が出来たらMuninの再起動……は必要ありませんが、rrdcachedを再起動しておいてください。(sudo service rrdcached restart)

動作確認

正常に動作しているかどうかはJournalファイルを確認するのが早いです。

正常に動作していればJournalファイルのパス(/var/lib/rrdcached/journal)に「rrd.journal.xxxxxxx.x.xxxxxx」と言うファイルが出来ます(xは数字)、正常に動作していると、Muninが動作するたびにこのファイルのサイズが大きくなっていきます。

もし、ファイルサイズが0から大きくならない場合は何か間違えています、「/var/log/munin/munin-update.log」を確認しましょう。

確認のためだけに5分待つのは無駄なので、Muninを今すぐ動かすコマンドがあります。

sudo su - munin --shell=/usr/bin/munin-cron

これであなたのMuninもrrdcachedでIO負荷の少ない素敵なツールに生まれ変わりました、「あたい(値)ったら最強ね!!」、特にRaspberry PiにMuninを設置する(僕の様な)奇特な方は設定しておかないとSDカードかCPUのIO Waitで死にます、rrdcachedがあって困る事はないと思われるのでぜひ設定してみて下さい。

 - サーバ運営 , ,