Munin をさらに触ってみた

社内で使っているサーバに munin-node を入れてリソース監視するようにしてみたときのメモ。

最初にちょっと触ってみたときの内容は↓こちら。

Munin マスターの設定ファイルはなるべく小さくした

Munin マスターの設定ファイルには監視対象の Munin ノードの情報を記述する必要がありますが、下記のように、グループ・ノード名、IP アドレス、などの、どうしても必要そうなものだけを記述しました。

[are-servers;sore-server]
use_node_name yes
address 192.0.2.123

通知の閾値は、後述の通り Munin ノード側のプラグインの設定で指定することができます。

通知先は、Munin マスターの設定ファイルのグローバルセクションで contact を登録しているだけです。

contact.mail-ore.command mail -s "Munin ${var:group}::${var:host}" -r sys+munin@example.com ore@example.com
contact.mail-ore.max_messages 10
contact.mail-ore.always_send critical

デフォルトの通知先は登録されている contact すべてなので、ノードごとやグループごとに通知先を変えたりしないのであれば、これだけで大丈夫です。

がしかし、実際のプロジェクトではグループで通知先を変える必要がありそうです。

[are-servers;]
contacts mail-ore

[are-servers;sore-server]
use_node_name yes
address 192.0.2.123

あと、warningcritical で通知先を変更したりはできないものなの?(ググるとよく出てくる always_send はそういう意味の設定じゃないはず)

Munin ノードの設定ファイルで通知の閾値を指定

通知の閾値の指定は、ググると大抵 Munin マスターの設定ファイルで指定している例が出てくるのですが、Munin ノードのプラグイン設定ファイルでも指定できます。

/etc/munin/plugin-conf.d/zz-misc.conf

[load]
env.load_warning 3
env.load_critical 6

Munin ノードでプラグインを config で実行すると、この値が確認できます。

munin-run load config | grep -E '(warning|critical)'
#=> load.warning 3
#=> load.critical 6

Munin マスターで同じフィールドに閾値を指定していなければ、この値が閾値として使用されます(マスターで閾値を指定するとそっちが優先されます)。

メモリ使用量の閾値を設定する項目

Cacti の SNMP での監視と比べると、メモリ使用量のグラフが細かく、積み上げグラフと折れ線グラフが一緒になっているため、どれに閾値を設定すれば良いのか判りにくいです。

vim /usr/share/munin/plugins/memory 曰く、データソースは /proc/meminfo で、積み上げグラフの計算式とその意味は次の通り。

  • apps
    • MemTotal - MemFree - Buffers - Slab - PageTables - SwapCached
  • page_tables
    • PageTables
  • swap_cache
    • SwapCached
  • slab_cache
    • Slab
  • cache
    • Cached
  • buffers
    • Buffers
  • unused
    • MemFree
  • swap
    • SwapTotal - SwapFree

unused だとページキャッシュでいずれ 0 に近づいてしまうだろうし、swap も頻繁にスワップイン/アウトしているならともかく単にスワップしているだけなら問題ないこともあるだろうので、閾値を設定するとしたら apps が一番それぽいでしょうか?

また、メモリ使用量の閾値は % でも指定することができます。swap の場合は SwapTotal に対するパーセンテージで、その他は MemTotal に対するパーセンテージです。

env.apps_warning 80% # 80% 以下を正常値とする
env.swap_warning 50% # 50% 以下を正常値とする

なお、Web 画面や通知のメールの中ではバイト数に計算されたものになるので、とても判りにくいです。

MySQL と nginx の監視

MySQL や nginx のメトリクスもデフォで対応しています。

MySQL の監視を有効にするためには perl の DBD::MySQLCache::Cache が必要です。

yum install perl-DBD-MySQL perl-Cache-Cache

nginx の監視を有効にするためには /nginx_statusstub_status を有効にする必要があります。

location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    deny all;
}

プラグインの自動有効化

munin-node-configure で、インストールされているプラグインの一覧を表示したり、利用可能なプラグインを表示したり、利用可能なプラグインを有効にするためのコマンドを一覧表示することができます。

インストールされているプラグインと有効/無効を表示

$ munin-node-configure
Plugin                     | Used | Extra information
------                     | ---- | -----------------
acpi                       | no   |
 :
cpu                        | yes  |
 :
if_                        | yes  | eth1
if_err_                    | no   |
 :

利用可能かどうかも一緒に表示する

$ munin-node-configure --suggest
Plugin                     | Used | Suggestions                            
------                     | ---- | -----------                            
acpi                       | no   | no [cannot read []
 :
cpu                        | yes  | yes
 :
if_                        | yes  | yes (+eth0 -eth1)
if_err_                    | no   | yes (+eth0)

プラグインを利用可能にするコマンドを表示する

$ munin-node-configure --shell
ln -s '/usr/share/munin/plugins/if_' '/etc/munin/plugins/if_eth0'
ln -s '/usr/share/munin/plugins/if_err_' '/etc/munin/plugins/if_err_eth0'

--remove-also を付けると利用不可能になったプラグインの削除もできます。

$ munin-node-configure --shell --remove-also
ln -s '/usr/share/munin/plugins/if_' '/etc/munin/plugins/if_eth0'
ln -s '/usr/share/munin/plugins/if_err_' '/etc/munin/plugins/if_err_eth0'
rm -f '/etc/munin/plugins/if_eth1'

プラグインのファミリ

munin-node-configure--families で対象となるプラグインの種類をしていできます。

families には次のようなものがあります(参考)。

  • auto
    • munin-node-configure で自動で有効にできるプラグイン
  • snmpauto
    • --snmp オプション付きで自動で有効にできるプラグイン
  • manual
    • 手動で有効にするプラグイン
  • contrib
    • いわゆる contrib なプラグイン

未指定の場合は、他に指定されているオプションによって対象となる種類が変わります。

  • なし
    • auto,contrib,manual
  • --suggest--shell
    • auto
  • --snmp
    • snmpauto

つまり、--families は指定しなくても概ね良きに計らってくれます。

プロセス監視

プロセス監視には ps_multips が使えますが、どちらも微妙な感じでした。

  • multipspgrep -f -l <name> | grep <regex> | wc -l の結果がメトリクス
    • がしかし pgrep -f -l の結果が CentOS 6 と CentOS 7 で違う
    • CentOS 6 なのか CentOS 7 なのか意識して設定しなければならない
  • ps_family=auto なプラグイン
    • munin-node-configure --shell --remove-also で自動で追加/削除される
    • と言いたいところだが ps_ は未対応
    • そのため、手動で配置しても munin-node-configure で消されてしまう
    • family=manual の間違いなのでは?
    • あるいは autoconf=no なら --remove-also の対象外になるべきなのでは?
    • munin-node-configure 使わずに個別に追加/削除すればいいのだけどうーん

その他

  • Munin ノードのセットアップは Ansible だけで余裕
    • サーバがたくさんあっても自動化で楽勝
    • Munin マスターも同じインベントリに入れれば、マスターへの監視対象の追加も自動化余裕ですが・・・
      • 監視サーバを複数のプロジェクトで共用する文化なので同じインベントリに含めるのは難しそう
  • Zabbix や Sensu なら監視対象の自動登録もできるのでちょっと楽
    • ただまあオートスケールとかでぼこぼこ増えたり減ったりするんじゃないなら Munin でも十分かな
  • やっぱり Cacti と比べてグラフの閲覧がしょぼい感
    • /var/lib/munin/datafile とかをどうにかして自前で閲覧画面は作れないかな?