社内で使っているサーバに 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
あと、warning
と critical
で通知先を変更したりはできないものなの?(ググるとよく出てくる 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::MySQL
と Cache::Cache
が必要です。
yum install perl-DBD-MySQL perl-Cache-Cache
nginx の監視を有効にするためには /nginx_status
で stub_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
が使えますが、どちらも微妙な感じでした。
multips
はpgrep -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
とかをどうにかして自前で閲覧画面は作れないかな?