リソース使用状況をグラフにしよう

munin-node-view

munin-dynazoom

サーバーのメモリや CPU の使用率、ディスクの空き容量、apache の接続数、キューに溜まっているメールの数等を Munin を使ってグラフに出力してみましょう。問題点が浮き彫りになるかも?なお、Munin のインストールは結構骨が折れるので、覚悟して下さい。

Munin はクライアントサーバー型のソフトウェアですが、今回はサーバーとクライアントの両方を同じ slackware マシンにインストールします。公式サイトから 2.0.19 をダウンロードします。

Munin のインストールの前に、 rrdtools を SlackBuilds でインストールします。Munin の動作に必要なものです。SlackBuilds の使い方はソースコードをらくらくコンパイルを参考にしてください。Slackware 14.1 用の rrdtools パッケージ:http://slackbuilds.org/repository/14.1/libraries/rrdtool/

パッケージを展開したら、中にある Makefile.config を編集します (詳細なインストール方法は INTALL に書いてあります)。今回は以下のように /usr/local/munin 以下にインストールしてみました。

--- Makefile.config.orig   2014-01-14 16:08:15.291355171 +0900
+++ Makefile.config     2014-01-14 16:11:47.538355171 +0900
@@ -17,10 +17,10 @@
 #
 # the base of the Munin installation.
 #
-PREFIX     = $(DESTDIR)/opt/munin
+PREFIX     = $(DESTDIR)/usr/local/munin

 # Where Munin keeps its configurations (server.conf, client.conf, ++)
-CONFDIR    = $(DESTDIR)/etc/opt/munin
+CONFDIR    = $(PREFIX)/etc

 # Server only - where to put munin-cron
 BINDIR     = $(PREFIX)/bin
@@ -42,13 +42,13 @@
 CGIDIR     = $(PREFIX)/www/cgi

 # Where to put internal data for master (RRD, internal files, ...)
-DBDIR      = $(DESTDIR)/var/opt/munin
+DBDIR      = $(DESTDIR)/usr/local/munin/db

 # Where to put CGI cached files (for master only)
 CGITMPDIR  = $(DBDIR)/cgi-tmp

 # Where to put internal data for node (plugin state, ...)
-DBDIRNODE  = $(DESTDIR)/var/opt/munin-node
+DBDIRNODE  = $(DESTDIR)/usr/local/munin/munin-node

 # Client only - Where the spool files are written. Must be writable by
 # group "munin", and should be preserved between reboots
@@ -63,7 +63,7 @@

 # Location of PID files and other statefiles. On the server, must be
 # writable by the user "munin".
-STATEDIR   = $(DESTDIR)/var/run/munin
+STATEDIR   = $(DESTDIR)/usr/local/munin/state

 # The perl interpreter to use
 PERL       := $(shell which perl)

munin ユーザーとグループを作成します。

sudo /usr/sbin/useradd -s /sbin/nologin -d /usr/local/munin munin
id munin
# 実行結果
#uid=1001(munin) gid=1001(munin) groups=1001(munin)

-s /sbin/nologin を指定することで、そのユーザーはログインできなくなります。-d /usr/local/munin でホームディレクトリを指定しています。何も指定しないと /home/munin という存在しないディレクトリが設定されてしまい、munin が正しく動作しないので注意しましょう。

それから make… の前に、必要な Perl モジュールをインストールします。 Munin は Perl で書かれています。必要なモジュールの一覧は INSTALL に載ってます。

初めて cpan (Perl のモジュールを手軽にインストールするための仕組み) を使うので、 cpan シェルを起動してみます。

kozu@slackware-> sudo cpan
パスワード:

CPAN.pm requires configuration, but most of it can be done automatically.
If you answer 'no' below, you will enter an interactive dialog for each
configuration option instead.

Would you like to configure as much as possible automatically? [yes] 

Autoconfigured everything but 'urllist'.

Now you need to choose your CPAN mirror sites.  You can let me
pick mirrors for you, you can select them from a list or you
can enter them by hand.

Would you like me to automatically choose some CPAN mirror
sites for you? (This means connecting to the Internet) [yes] 
Trying to fetch a mirror list from the Internet
Fetching with HTTP::Tiny:
http://www.perl.org/CPAN/MIRRORED.BY

Looking for CPAN mirrors near you (please be patient)
........................ done!

New urllist
  http://cpan.sarang.net/
  http://ftp.kaist.ac.kr/pub/CPAN/
  http://ftp.neowiz.com/CPAN/

Autoconfiguration complete.

commit: wrote '/root/.cpan/CPAN/MyConfig.pm'

You can re-run configuration any time with 'o conf init' in the CPAN shell
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v2.00)
Enter 'h' for help.

変なミラーサイトが選ばれてしまったので、直します。o conf urllist shift でミラーサイトを1つ削除できます。ここでは3回行ってミラーサイトを全て削除しています。それから unshift で新しいミラーサイトを押し込んでいます。o conf commit で設定を保存します。

cpan[7]> o conf urllist shift
Please use 'o conf commit' to make the config permanent!

cpan[8]> o conf urllist shift
Please use 'o conf commit' to make the config permanent!

cpan[9]> o conf urllist shift
Please use 'o conf commit' to make the config permanent!

cpan[10]> o conf urllist unshift http://ftp.nara.wide.ad.jp/pub/CPAN/
Please use 'o conf commit' to make the config permanent!

cpan[11]> o conf urllist unshift http://mirror.jre655.com/CPAN/
Please use 'o conf commit' to make the config permanent!

cpan[12]> o conf commit
commit: wrote '/root/.cpan/CPAN/MyConfig.pm'

cpan[13]> q
Terminal does not support GetHistory.
Lockfile removed.

とりあえず q コマンドで cpan シェルを終了しました。モジュールをもりもりインストールしましょう。途中いくつか質問されることがありますが、全部デフォルト値のままエンターキーを押すだけで十分です。

# メモリ不足で CPAN が異常終了するので、プロセスデータセグメントの最大サイズを設定します。
# slackware 14.1 のデフォルト値は unlimited みたいです。
ulimit -d $((256 * 1024 * 1024))
sudo cpan install Time::HiRes
# 中略
#  /usr/bin/make install  -- OK
# 以下同様です。
sudo cpan install Storable
sudo cpan install Digest::MD5
sudo cpan install HTML::Template
sudo cpan install Text::Balanced
sudo cpan install Params::Validate
sudo cpan install Net::SSLeay
sudo cpan install Getopt::Long
sudo cpan install File::Copy::Recursive
sudo cpan install CGI::Fast
sudo cpan install IO::Socket::INET6
sudo cpan install Log::Log4perl
# IPC::Shareable はテストで失敗します...
sudo cpan install IPC::Shareable
sudo cpan install Log::Dispatch
sudo cpan install MIME::Lite
sudo cpan install Mail::Sender
sudo cpan install Mail::Sendmail

インストールマニュアルには書かれてませんが、以下のモジュールも必要なようです。

sudo cpan install Net::Server
sudo cpan install Net::SNMP
sudo cpan install HTML::Template::Pro
sudo cpan install DBD::SQLite # これは不要かも?
sudo cpan install Date::Manip

Perl モジュールのインストールが終わったら、Munin の Makefile.config のあるディレクトリに移動して make 等を行います。

cd ~/src/munin-2.0.19
make
# Munin のインストール
sudo make install
# Munin ノードとノード用プラグインのインストール
sudo make install-common-prime install-node-prime install-plugins-prime
# Munin 用の cron ジョブのインストール
sudo cp build/resources/linux-cron.d_munin /etc/cron.d/munin
# 所有者の変更
sudo chown -R munin:apache /usr/local/munin
# munin-cgi-html 等がファイルを書き込もうとします
sudo chmod -R g+w /usr/local/munin/{db,www,log}   # www は不要?

Munin サーバーが Munin-node (監視対象) にリソースの使用状況を問い合わせます。グラフ化したい項目ごとにプラグインというものが必要です。デフォルトで様々なプラグインが用意してあり、 munin-node-configure スクリプトを使って使用可能なプラグインを有効にします。

sudo /usr/local/munin/sbin/munin-node-configure  --suggest --shell | sudo bash

Munin-node の起動スクリプトを書きます。

#!/bin/bash

case $1 in
start)
  /usr/local/munin/sbin/munin-node
  rv=$?
  if [ $rv -eq 0 ]; then
    echo "munin-node started"
  else
    echo "start failed"
    exit $rv
  fi
  ;;
stop)
  pkill munin-node
  rv=$?
  if [ $rv -eq 0 ]; then
    echo "munin-node stopped"
  else
    echo "stop failed"
    exit $rv
  fi
  ;;
restart)
  $0 stop && $0 start
  ;;
*)
  echo "usage: $(basename $0) {start|stop}"
  ;;
esac

※ 2014-01-16
ボケてました。pkill munin-node すると rc.munin-node が死んじゃいます…。

--- rc.munin-node~      2014-01-16 21:42:20.265542680 +0900
+++ rc.munin-node       2014-01-16 21:43:49.254542680 +0900
@@ -1,5 +1,7 @@
 #!/bin/bash

+PID=/var/run/munin/munin-node.pid
+
 case $1 in
 start)
   /usr/local/munin/sbin/munin-node
@@ -12,7 +14,7 @@
   fi
   ;;
 stop)
-  pkill munin-node
+  kill $(cat "$PID")
   rv=$?
   if [ $rv -eq 0 ]; then
     echo "munin-node stopped"

上のスクリプトに実行権限を付けて start します。

sudo chmod +x /etc/rc.d/rc.munin-node
sudo /etc/rc.d/rc.munin-node start

munin-node が起動して 4949/tcp をリッスンしてるか確認します。

sudo netstat -tulpn | grep 4949
# 実行結果
#tcp6       0      0 :::4949                 :::*                    LISTEN      20621/perl

telnet で確認します。

telnet localhost 4949
# telnet 接続後の様子です
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
# munin node at slackware.web-press.net
list
cpu df df_inode entropy forks fw_conntrack fw_forwarded_local fw_packets if_err_eth0 if_eth0 interrupts irqstats load memory munin_stats netstat nfs4_client nfs_client nfsd nfsd4 open_files open_inodes postfix_mailqueue proc_pri processes sendmail_mailstats sendmail_mailtraffic swap threads uptime users vmstat
quit
Connection closed by foreign host.

上の方で /etc/cron.d/munin を作成しているので、数十分すると localhost のデータが溜まってきます。

今度は溜まったデータをグラフで見れるように apache を設定します。今ご覧の wordpress が動いているバーチャルホストで munin を見れるように設定します (/munin-cgi/munin-cgi-html/ にアクセスすると Munin の画面が出るようにする)。wordpress の pretty URL 用の RewriteRule がちょっと邪魔なので、ルールを1行追加します。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# 下の1行を追加
RewriteRule ^munin-cgi - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

slackware.web-press.net のバーチャルホストコンテナに /munin-cgi/munin-cgi-html 等の設定を書き加えます。IP アドレスでアクセス制限してあります (ごめん!)。なお、fast cgi の使用がオススメらしいですが、ここでは普通の cgi として動作させます。

<VirtualHost *:80>
    # 中略
    ScriptAlias /munin-cgi/munin-cgi-graph /usr/local/munin/www/cgi/munin-cgi-graph
    <Location /munin-cgi/munin-cgi-graph>
        Options +ExecCGI
        SetHandler cgi-script
        #Allow from all
        require ip ひ♡み♡つ
    </Location>

    ScriptAlias /munin-cgi/munin-cgi-html /usr/local/munin/www/cgi/munin-cgi-html
    <Location /munin-cgi/munin-cgi-html>
        Options +ExecCGI
        SetHandler cgi-script
        #Allow from all
        require ip ひ♡み♡つ
    </Location>

    Alias /munin-cgi/static /usr/local/munin/etc/static
    <Location /munin-cgi/static>
        require ip ひ♡み♡つ
    </Location>

    # 若干ヤケクソ気味です
    Redirect /munin-cgi/munin-cgi-html/static/dynazoom.html /munin-cgi/static/dynazoom.html
</VirtualHost>

apachectl で文法チェックしてリロードします。

sudo /usr/sbin/apachectl configtest
# 実行結果
#Syntax OK
sudo /usr/sbin/apachectl graceful

Munin の動作設定を cgi 用に変更します。/usr/local/munin/etc/munin.conf を編集します。

--- /usr/local/munin/etc/munin.conf.orig   2014-01-14 19:06:21.500542680 +0900
+++ /usr/local/munin/etc/munin.conf     2014-01-14 19:34:18.271542680 +0900
@@ -5,23 +5,23 @@
 # must be writable by the user running munin-cron.  They are all
 # defaulted to the values you see here.
 #
-#dbdir /usr/local/munin/db
-#htmldir /usr/local/munin/www/docs
-#logdir /usr/local/munin/log/munin
-#rundir  /var/run/munin
+dbdir  /usr/local/munin/db
+htmldir /usr/local/munin/www/docs
+logdir /usr/local/munin/log/munin
+rundir  /var/run/munin

 # Where to look for the HTML templates
 #
-#tmpldir       /usr/local/munin/etc/templates
+tmpldir        /usr/local/munin/etc/templates

 # Where to look for the static www files
 #
-#staticdir /usr/local/munin/etc/static
+staticdir /usr/local/munin/etc/static

 # temporary cgi files are here. note that it has to be writable by 
 # the cgi user (usually nobody or httpd).
 #
-# cgitmpdir /usr/local/munin/db/cgi-tmp
+cgitmpdir /usr/local/munin/db/cgi-tmp

 # (Exactly one) directory to include all files from.
 includedir /usr/local/munin/etc/munin-conf.d
@@ -38,6 +38,7 @@
 # It is single threaded *by design* now.
 #
 #graph_strategy cron
+graph_strategy cgi

 # munin-cgi-graph is invoked by the web server up to very many times at the
 # same time.  This is not optimal since it results in high CPU and memory
@@ -45,11 +46,11 @@
 # 6.  Most likely the optimal number for max_cgi_graph_jobs is the same as
 # max_graph_jobs.
 #
-#munin_cgi_graph_jobs 6
+munin_cgi_graph_jobs 6

 # If the automatic CGI url is wrong for your system override it here:
 #
-#cgiurl_graph /munin-cgi/munin-cgi-graph
+cgiurl_graph /munin-cgi/munin-cgi-graph

 # max_size_x and max_size_y are the max size of images in pixel.
 # Default is 4000. Do not make it too large otherwise RRD might use all
@@ -67,6 +68,7 @@
 # - cgi html has some bugs, mostly you still have to launch munin-html by hand
 # 
 #html_strategy cron
+html_strategy cgi

 # munin-update runs in parallel.
 #

さて、この状態で /munin-cgi/munin-cgi-html/ にアクセスすると、スタイルも何も適用されていないおかしなページが表示されます。正攻法が分からないので、 munin のテンプレートをいじってしまいましょう。テンプレートファイルは /usr/local/munin/etc/templates にあります。 – で始まる行は削除、 + は追加、です。詳細は diff を参照してください。

--- /usr/local/munin/etc/templates/munin-serviceview.tmpl.orig     2014-01-14 19:21:01.166542680 +0900
+++ /usr/local/munin/etc/templates/munin-serviceview.tmpl       2014-01-14 19:21:25.311542680 +0900
@@ -73,7 +73,7 @@
 <tr>
        <th>Field</th>
        <th><span title="For use in munin.conf">Internal name</span></th>
-       <th><a href="<TMPL_VAR ESCAPE="URL" NAME="R_PATH">/static/definitions.html#data_types">Type</a></th>
+       <th><a href="/munin-cgi/static/definitions.html#data_types">Type</a></th>
        <th>Warn</th>
        <th>Crit</th>
        <th>Info</th>
--- /usr/local/munin/etc/templates/partial/head.tmpl.orig  2014-01-14 19:21:30.726542680 +0900
+++ /usr/local/munin/etc/templates/partial/head.tmpl    2014-01-14 19:21:59.716542680 +0900
@@ -3,11 +3,11 @@
           "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
-  <link rel="stylesheet" href="<TMPL_VAR NAME="R_PATH">/static/style-new.css" type="text/css" /> 
+  <link rel="stylesheet" href="/munin-cgi/static/style-new.css" type="text/css" /> 
   <TMPL_IF NAME="SHOW_ZOOM_JS">
-     <script src="<TMPL_VAR NAME="R_PATH">/static/formatdate.js" type="text/javascript" language="javascript"/>
-     <script src="<TMPL_VAR NAME="R_PATH">/static/querystring.js" type="text/javascript" language="javascript"/>
-     <script src="<TMPL_VAR NAME="R_PATH">/static/zoom.js" type="text/javascript" language="javascript"/>
+     <script src="/munin-cgi/static/formatdate.js" type="text/javascript" language="javascript"/>
+     <script src="/munin-cgi/static/querystring.js" type="text/javascript" language="javascript"/>
+     <script src="/munin-cgi/static/zoom.js" type="text/javascript" language="javascript"/>
   </TMPL_IF>
   <TMPL_UNLESS NAME="SHOW_ZOOM_JS">
     <meta http-equiv="refresh" content="300" /> 
@@ -15,7 +15,7 @@
   <title><TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"> :: <TMPL_VAR ESCAPE="HTML" NAME="pathname"><TMPL_ELSE>Munin</TMPL_IF></TMPL_LOOP></title>
   <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
   <meta name="author" content="Auto-generated by Munin" />
-  <link rel="icon" type="image/vnd.microsoft.icon" href="<TMPL_VAR NAME="R_PATH">/static/favicon.ico" />
-  <link rel="SHORTCUT ICON" href="<TMPL_VAR NAME="R_PATH">/static/favicon.ico"/>
+  <link rel="icon" type="image/vnd.microsoft.icon" href="/munin-cgi/static/favicon.ico" />
+  <link rel="SHORTCUT ICON" href="/munin-cgi/static/favicon.ico"/>

 </head>

ログローテートも設定しましょう。たぶんこんな感じ。

/usr/local/munin/log/munin/*.log {
        weekly
        missingok
        copytruncate
        notifempty
}

たぶんこれで大体終わりです。監視対象を増やす時は、対象のホストに munin-node とプラグイン一式をインストールし、必要なプラグインを設定し、munin-node を動かしておきます。それから munin サーバーの munin.conf に監視対象の名前とアドレスを書き加えます。

プラグインの設定は munin-node.conf とか plugin-conf.d/hoge とかで行います。プラグイン自体は /usr/local/munin/lib/plugins にあります。pod2text でマニュアルが読めます。

pod2text /usr/local/munin/lib/plugins/postfix_mailqueue | less

今回は wordpress を使ったバーチャルホストと munin を同居させましたが、munin 用にサブドメインとバーチャルホストを作ったほうが良かったかも?

(コウヅ)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中