muninの表示がクソ重くなっていたのを劇的に改善した話

by dirkjankraan.com



某所の"munin"がびっくりするくらい画面表示が重くなっていて、ひょんなことから改善することになった話。

前提条件として、このmuninが動いているサーバは数百台のノード(サーバ)を管理している状態で、muninのバージョンは2.0系でした。

本当は、後学のためにも作ってくれた人に直してもらうべきと思いつつ、あまり悠長なことも言ってられない感じだったので、一人チューニンガソンを敢行。・・・要望があったのでログを残しておきます。(遅くなってごめんなさい)

最初の状態(before)

まず、muninのトップページですが、開いてみると、、、

うほっ、19.61秒かかっておりました。これはなかなかのストレスです。
特にHTML部分の出力に19.4秒かかっている。ここをなんとかせねばなるまい。


次に4台分のサーバの各リソースの負荷状況が確認できるページを表示してみると

ズラズラと出ております。各グラフ画像のpngファイルを1つ返すのに700ミリ秒程かかっていますね。ふむふむ。


結局、1ページ分全部読み込み終わるまでにトータルで29.75秒かかっていました。
さて、なんとかしてみましょう。

1. HTMLページを静的に生成

まず、muninの設定ファイルである"/etc/munin/munin.conf"を見てみると、

html_strategy cgi

が入っていてHTMLファイルが動的に生成されるようになっていました。
おそらく、某所での経緯的に、バージョン1.4時代は、数百台のノードを管理していると、各種の静的ファイルの生成にマシンリソースをとられすぎて重かったため、全部動的にしてみたんじゃないかと思われます。
が、おそらくページ全体から見ると、構成するファイルは画像がほとんどだと思うので、HTMLだけを静的に事前生成するようにしておきます。

どうも調べてみると、munin2.0系はHTMLの生成は静的がデフォルトみたいなので、上記をコメントアウトするか、

html_strategy cron

明示的に、↑な感じで指定します。
あとは、生成したHTMLを出力する場所として、

htmldir /var/www/html/munin/docs/

こんな感じで設定しておきます。


次に、ページ配信はApacheを介して行われていたので、apacheのconfで、

    RewriteCond %{REQUEST_URI} !^/static
    RewriteCond %{REQUEST_URI} .html$ [or]
    RewriteCond %{REQUEST_URI} =/
    RewriteRule ^/(.*)          /var/www/html/munin/cgi/munin-cgi-html/$1 [L]

↑のような記載があったので、全てコメントアウトした上で、

    DocumentRoot /var/www/html/munin/docs

こんな感じで、先ほど設定したHTMLの出力場所が見れるようにしておきます。(VirtualHostでmunin専用にきられていたので、DocumentRootでトップに指定しちゃいました。)


・・・さて、これでどうなったかというと、

トップページのHTMLページが49msecで返るようになりました。静的ページですからね・・・。


グラフのページもHTMLは高速で返るようになっています。


グラフのページ全体では15.97秒です。少しマシになりました。

2. CGI処理している部分をFastCGIに変えた

これは定石ではありますが、各グラフ画像の動的生成はCGIで処理されていたので、ここにFastCGIを突っ込みました。
ApacheへのFastCGIモジュールの導入は、ググるとやり方がたくさん出てくるので、そちらを参考にしてください。

あわせて、munin側の設定の仕方は、muninの公式ドキュメントの「CgiHowto2 – Munin」に載っているので、こちらを参考に設定してみてください。

ちなみに、"cgitmpdir"はtmpfs上に置いてみました。


・・・一応、簡単に説明しておくと、munin.confは

cgitmpdir /data_tmp/munin
graph_strategy cgi
cgiurl_graph /cgi/munin-cgi-graph

こんな感じで入っているかを確認と、
Apache側の設定は、

LoadModule fcgid_module modules/mod_fcgid.so

fcgiのモジュールのロードと、(モジュールの作り方はググってくださいね。)

    RewriteEngine On

    RewriteRule ^/cgi/munin-cgi-graph/(.*) /$1

    RewriteCond %{REQUEST_URI}                 !^/static
    RewriteCond %{REQUEST_URI}                 .png$
    RewriteRule ^/(.*) /var/www/html/munin/cgi/munin-cgi-graph/$1 [L]

    <Directory /var/www/html/munin/cgi>
        Options +ExecCGI
        SetHandler fcgid-script
    </Directory>

こんな感じで入っていればOKかと。(すいません、書くのが面倒くさくなってきて・・・)


さて、この時点で、グラフのページをもう1度表示してみると、、、

各グラフ画像のpngファイルが70ミリ秒くらいで返るようになったのが確認できます。素のCGIと比較して1/10くらいのレスポンスタイム。


グラフのページはトータルでも2.26秒で返せるようになりました。

3. 静的ファイルを圧縮して配信

さて、この辺からはおまけ的になってきますが、返す静的なファイルもモノによっては数十〜数百KBあり、muninのサーバのパワーに余裕があったので圧縮して配信してみます。
コレもやり方は、ググるとたくさん出てきますが、一応書いておくと、Apacheで

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript

こんな感じでmuninで扱っていそうな静的ファイルの種類のものだけ記載。
といった感じです。


さて、トップページを表示してみると、、、

配信サイズが小さくなって、217msecと若干早くなっていますが、インターナルな高速通信環境ということもあって、もはや体感はできないですね。


グラフのページも静的なファイルのサイズが小さくなり、、、


トータルは2.21秒となりました。

4. keepaliveを有効にする

よくよく考えると、グラフのページは大量の画像ロードがあるのと、muninにアクセスするユーザはたくさんいるわけではないので、Apacheのkeepaliveを有効にしておきます。

    KeepAlive On
    KeepAliveTimeout 3

こんな感じ。(KeepAliveTimeoutは環境にあわせて適切に設定してください。)


これでトップページはというと、、、

196msecとこれまた若干速くなりました。


グラフのページに関しても、1.96秒と若干の効果はあるみたいですね。
さっきの設定もそうですが、チリも積もればなんとやらってことで・・・。


さて、ここまでの設定で、

  • トップページは、19.61秒 ⇒ 196ミリ秒
  • グラフのページ(サーバ4台)は、29.75秒 ⇒ 1.96秒

まで改善できました。これくらいなら、まともに使えそうですよね。

おまけ. ブラウザキャッシュを活用、その他

muninのページで必ず読まれる系のファイルは、毎回リクエストしにいっても無駄なので、

    <Directory /var/www/html/munin/static>
        ExpiresActive On
        ExpiresDefault "access plus 1 days"
    </Directory>

こんな感じでキャッシュを使えるようにしておくとよいと思います。


あとは、muninを稼動させているサーバのマシンリソース(主にCPU)を確認しながら、

  • FastCGIの起動プロセス数の調整
  • muninのmunin_cgi_graph_jobsの調整
  • muninのmax_processesの調整
  • (ディスクI/Oがネックになっていれば)SSDã‚„tmpfsの利用検討

あたりをチェックしておけばいいのではないでしょうか。


・・・ちなみに、実は3ヶ月くらい前にやったことを書き起こしたので、何か漏れとかあるかもしれません。その場合は、ご容赦ください。
それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́

参考


キャパシティプランニング ― リソースを最大限に活かすサイト分析・予測・配置

キャパシティプランニング ― リソースを最大限に活かすサイト分析・予測・配置