munin を使って監視情報をグラフ化する(監視側, CentOS 5.4) - Linux の使い方


システム状態を監視情報をグラフ化する

CentOS 5.4 では、munin というソフトウェアを使用することで、システムの CPU 利用率やネットワークトラフィックなどの詳細情報を監視してグラフ化することができるようになります。

今回は、munin-node で収集されたシステム情報を munin を使ってグラフ化することについて記してみようと思います。システム情報を提供するための munin-node については munin-node で監視情報を送信する の方に記しています。

 

CentOS 5.4 の場合は、既定では munin はインストールされていないので、まずはそのインストールから行います。

インストールには yum を使って、rpmforge リポジトリからインストールすることが可能です。リポジトリに rpmforge を追加する方法については CentOS 5.4 のシステムアップデート取得先としてリポジトリを追加する を参考にしてください。

yum --enablerepo=rpmforge install munin

このようにすることで、rpmforge リポジトリから munin をインストールすることが出来ました。

 

munin のインストールが完了したら、設定ファイル "/etc/munin/munin.conf" を編集して、munin の設定を行います。

まず、munin で監視した情報をグラフ化したページの保存先や監視データの保存場所などを決定する場所を確認しておきます。既定では次のようになっているようでした。

dbdir /var/lib/munin
htmldir /var/www/munin
logdir /var/log/munin
rundir /var/run/munin

これについては、必要であれば変更すれば良いでしょう。

また、[localhost] という部分も、必要に応じて変更すると良いでしょう。今回は、自分自身の監視として "address" は 127.0.0.1 を使用しますが、表示名は少しわかりやすいように [GROUP1;HOST1] というようにしてみようと思います。

[GROUP1;HOST1]

address 127.0.0.1

use_node_name yes

port 4949

また、参考として、ポート番号を "port" を使って明示的に指定してみました。このポート番号は "address" で指定した監視対象の munin-node で設定したポート番号に合わせる必要があります。

 

なお、実際に運用を行ったときに、cron による実行の度に "(process:27836): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()" という警告メッセージが出力される場合があります。

これは、"/usr/share/munin/plugins/hddtemp_smartctl" の 138 行目にある print "graph_vlabel temp in °C\n という行に問題があるらしいです。ここの "°" の記号のせいで警告が出ているようなので、消してしまうなどして対応すれば良いようでした。"DegC" や "摂氏" などでも大丈夫のようです。

余計なエラーログが出力されないように、上記のように設定ファイルを調整しておくと良いでしょう。

 

設定ファイルを調整したら、念のため "htmldir" や "dbdir" 等の munin が書き込みを行うディレクトリーの所有者が munin になっていることを確認しておきます。

ls -ld /var/www/munin /var/lib/munin

このようにして、所有者とグループとが両方とも "munin" になっていることを確認します。なっていない場合には、"chown -R munin.munin /var/www/munin /var/lib/munin" などとして、所有権を調整しておきます。

 

続いて、収集された監視情報がグラフ化されたページを閲覧できるように Apache の設定を調整します。Apache がインストールされていない場合は Apache を起動する を参考にして Apache を起動できるようにしておきます。

Apache の設定は、munin をインストールした際に "/etc/httpd/conf.d/" ディレクトリーに "munin.conf" という設定ファイルが用意されています。 <Directory> ディレクティブはコメントアウトされているので、必要であればアクセス制限を設定するなど、環境に併せて調整します。

 

最後に cron による munin の情報収集スケジュールを確認しておきます。

munin のインストールを行うと、"/etc/cron.d/munin" として、次の内容のスケジュールが登録されるようでした。。

MAILTO=root

 

*/5 * * * *    munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron

これにより 5 分毎に munin-node から情報を収集してくれるようになっているようです。MAILTO の部分は cron 実行に関する通知メールの送信先ですので、必要に応じて通知先のメールアドレスを設定すると良いでしょう。

 

ともあれ、これで設定は完了です。

しばらくすると munin によって munin-node から監視情報が回収されて、Apache に設定した Web サイト(例えば http://localhost/munin/) から、監視情報をグラフで確認することができるようになりました。

 

なお、監視するノードを追加したい場合など、運用後に munin の設定を変更したい場合には、"/etc/munin/munin.conf" を書き換えて保存してあげるだけで大丈夫です。

Apache など特に何かを再起動するなどの必要はなく、収集処理の際に新しい設定が適用されて、監視ノードを追加した場合には、ちゃんとそれが確認できるようになっています。

 

"Lock already exists: /var/run/munin/munin-update.lock. Dying." が通知される場合

なお、運用を始めてみたときに cron による munin-update 実行のたびに "Lock already exists: /var/run/munin/munin-update.lock. Dying." というメッセージが出力されてしまう状況がありました。

これを解消するための方法として、併せて次の設定を追記しておくと良いような情報がみつかりました。

fork no

よく解ってはいないのですが、この設定箇所は、全体に 1 個になるのか、それとも [GROUP1;HOST1] のような、ホストの監視設定を行うところにホストごとに設定する感じになるのでしょうか。

当方で確認してみた限りでは効果はないような感じでしたが、状況にも依ると思うので、参考として記載しておくことにしました。

 

ともあれこうすることで、cron による munin 実行の度に発生する "Lock already exists: /var/run/munin/munin-update.lock. Dying." というエラーメッセージを出なくすることができるらしいのです。

ただ、実際に自分の環境でもこのメッセージが出てしまったため、上記の対応を取ってみたのですけど、それによって改善されることはありませんでした。試しに 手動で "/var/run/munin/munin-update.lock" を削除してみても、その状況は変わらない様子です。

 

さらに調べを進めてみると、どうやら cron が実行される 5 分間隔よりも munin-update というプロセスが長く時間がかかっているからという情報もあったので、試しに 10 分間隔にしてみたところ、今度はグラフが更新されなくなってしまいました。

再び 5 分間隔に戻して crond を再起動してみたら、しばらくはメッセージが出なくなり、グラフも更新されるようになったのですけど、またしばらくしたら再び "Lock already exists" のメッセージが出てしまうようになってしまいます。

 

さらに調べを進めてみると、これはどうやら Hyper-V サーバーでの時刻の大幅なずれを ntpdate で定期的に強制調整していたために発生している可能性へと行きつきました。

標準では munin-update は毎時 0 分からの 5 分おきに実行されるように設定されていますが、ntpdate で時刻調整していると、例えば 3 秒進んだ 00時 00分 02秒を、本来の 23時 59分 59秒に戻すことにより、00時 00分のタイミングで実行される munin-update が、4 秒の間に 2 回実行されてしまうことがあるらしく、これによってついさっき起動された munin-update が終わらないうちに新しい munin-update が起動して、ロックファイルが検出されるというような感じになっているようでした。

これを解消するためには、Hyper-V 上の Linux でシステム時刻を同期する を参考に、ntpd を利用した滑らかな時刻同期を行う必要がありました。

ntpd で時刻を同期して以来、それから数日は立ちますが、今のところは問題の通知メッセージは出力されなくなりました。対応するまではほぼ 5 分おきにメッセージが出力されていましたので、ほぼ間違いなく効果があったと思われます。