Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

Muninの負荷を5分の調整で劇的に減らし、グラフ表示を高速化する方法

サーバ負荷メトリクス分析ツール「Munin」は、導入・運用保守コストが圧倒的に低いのが特徴です。
しかし、たった数十台の監視を行うだけで、5分おきの更新もままならない程のCPU・I/O負荷となります。
設定の手間の掛かるCactiやGangliaへの乗り換えも面倒で仕方ありません。

この記事は、そんな悩みを抱えるインフラエンジニアへ贈るTipsです。

環境

課題

以下のような課題を抱えているなら、この記事が役立つはずです。
  • 更新負荷が高く、5分では終わらない状態となった
  • グラフ動的生成化するとcgiが必要&表示が重たいため、軽快にグラフ表示を行いたい
  • 速度低下を覚悟で グラフ動的生成化 を行ったが、今度はhtml更新中のグラフ欠落に悩まされている

動作分析

Muninは5分おきに何をしているのか、解説します。
STEP1〜2は低負荷ですが、STEP3以降はCPU・I/Oを必要とする処理です。
【STEP-1】
設定ファイルの構文チェック
【STEP-2】
対象ホストのデータを収集してrrdデータとして保存する
【STEP-3】
rrdデータからpng形式でグラフ画像生成を「サーバ数xグラフ数x単位期間分」の数だけ行う
【STEP-4】
グラフを含む全てのhtmlファイルの更新を行う
この中ではSTEP-3で生成したpngファイルを1つ1つ開いて縦横サイズ取得も行われている

解決策

先程の動作分析で、【STEP-3】以降の処理が高負荷である事が分かりました。
解決の方向性としては、グラフ精度には影響を与えずにグラフ生成のタイミングを調整する対応とします。
rrdデータからpng形式でグラフの画像書き出しを行う
Muninというプロダクトの設計思想上、長期的視野でのメトリクス分析に用いるものです。
その為、ほぼリアルタイムな5分毎のグラフ更新は理想であって、実際の所は1日3回も更新すれば十分ではないでしょうか?
今回の例では、始業前(8:00)・昼休み(13:00)・帰宅前(18:00)の3回の更新とします。
グラフを含む全てのhtmlファイルの更新を行う
サーバ追加時かMuninプラグイン追加時以外は構成が変わらないので、究極的には追加時の手動実行にも出来ます。
しかしながらそれは運用の手間を増やすだけなので、頻度だけ下げて1日1回(0:30)の更新とします。

※ リアルタイム監視はnagios等の併用をお勧めします。

実施方法

上記の解決策を設定に落とし込みます。
話は簡単。「/etc/cron.d/munin」を以下の様に書き換えるだけです。
変更後に再起動等は不要です。
なお、munin-limitsに関する記述がある場合には、そのまま残してください。
変更前
#
# cron-jobs for munin
#

*/5 * * * *     munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron 
変更後
#
# cron-jobs for munin
#

*/5 * * * *     munin test -x /usr/bin/munin-cron && /usr/share/munin/munin-update 
0 8,13,18 * * *     munin test -x /usr/bin/munin-cron && /usr/share/munin/munin-graph
30 0 * * *     munin test -x /usr/bin/munin-cron && /usr/share/munin/munin-html
さあ、これで軽快なMuninライフをお送りください!