muninでapacheとclamdのメモリ使用量をグラフ化する

1GBしかないVPSサーバのメモリを有効利用するために、最も使用率の高いapacheとclamdのメモリ使用量をグラフ化するmuninプラグインを作成してみました。
httpd-day

使用量を計算するコマンドを組み立てる

まずはpsコマンドの結果をapacheのプロセス名「httpd」でフィルタリングします。

# ps aux | grep httpd
root      2701  0.0  0.7 318924  7576 ?        Ss   Jan16   1:01 /usr/sbin/httpd
root      5591  0.0  0.0 103308   844 pts/0    S+   22:18   0:00 grep httpd
apache   11670  0.0  5.5 348404 56444 ?        S    12:07   0:19 /usr/sbin/httpd
apache   17444  0.0  5.3 348324 54560 ?        S    13:08   0:18 /usr/sbin/httpd
apache   17445  0.0  5.4 348244 55100 ?        S    13:09   0:16 /usr/sbin/httpd
apache   17928  0.0  5.5 348952 56196 ?        S    13:11   0:17 /usr/sbin/httpd
apache   18407  0.0  5.4 349120 55768 ?        S    13:15   0:20 /usr/sbin/httpd
apache   18890  0.0  5.5 349188 56480 ?        S    13:20   0:26 /usr/sbin/httpd
apache   18891  0.0  5.6 349188 57136 ?        S    13:20   0:28 /usr/sbin/httpd
apache   23223  0.0  5.4 348124 55404 ?        S    14:09   0:13 /usr/sbin/httpd
apache   23707  0.1  5.4 348860 56080 ?        S    14:11   0:35 /usr/sbin/httpd
apache   25148  0.0  5.4 348200 55152 ?        S    14:26   0:16 /usr/sbin/httpd

各プロセスのメモリ使用量は6列目にあるのでawkコマンドで6列だけを抽出します。ついでにgrepコマンドが混ざっているので「grep -v」で除外します。

# ps aux | grep httpd | grep -v grep |awk '{print $6}'
7576
10012
55444
55100
56196
55768
56224
56880
55404
56080
56364

次にこれらの数字を合計します。psコマンドの結果はKB(キロバイト)で表示されますが、muninははB(バイト)で処理をするので計算結果を1024倍にします。

# ps aux | grep httpd |grep -v grep | awk '{sum += $6}END{print sum}'
547776

# ps aux | grep httpd |grep -v grep | awk '{sum += $6}END{print sum*1024}'
560922624

これでapacheのメモリ使用量が分かりました。clamdも組み立て方は同様です。

muninプラグインを作成する

muninの自作プラグインを紹介するページを参考にプラグインを組み立てます。
今回はapache・clamdと、サーバがコミットしたメモリ量の関係性も見ておきたいので、/proc/meminfoのCommitted_ASもグラフ化します。

なおmuninはグラフを設定した順にグラフの下から上に積み重ねられ、グラフ毎の色分けは完全固定です。表示させたいグラフがたくさんある場合は「並び」にも気を付ける必要があります。

# vi /etc/munin/plugins/httpd#!/bin/sh

#%# family=auto
#%# capabilities=autoconf

#コマンド結果をGET*****に格納する
GETHTTPDMEM=`ps aux | grep httpd| grep -v grep | awk '{sum += $6}END{print sum*1024}'`
GETCLAMDMEM=`ps aux | grep clamd| grep -v grep | awk '{sum += $6}END{print sum*1024}'`
GETCOMMITED=`cat /proc/meminfo |grep Committed_AS|awk '{print $2*1024}'`

#プラグインが利用可能ならyesを返す。利用不可ならnoを返す。
if [ "$1" = "autoconf" ]; then
        if [ -n ${GETHTTPDMEM} ] ; then
                echo yes
                exit 0
        else
                echo no
                exit 0
        fi
fi

# グラフの描写設定
if [ "$1" = "config" ]; then
# グラフタイトル
        echo 'graph_title service used memory'
# グラフの設定 1024で1k、Y軸は0スタート。
       echo 'graph_args --base 1024 --lower-limit 0'
# グラフ縦軸の単位
       echo 'graph_vlabel Bytes'
# muninのカテゴリ設定
        echo 'graph_category system'

# clamdグラフのラベル
        echo 'clamd.label clamd used memory'
# clamdグラフの最小値
        echo 'clamd.min 0'
# clamdグラフの表示設定「エリア(塗りつぶし)表示」
        echo 'clamd.draw AREA'
# clamdグラフの数値「ゲージ(数値そのまま)」
        echo 'clamd.type GAUGE'
        echo 'httpd.label httpd used memory'
        echo 'httpd.min 0'
# httpdグラフの表示設定「スタック(積み重ね)表示」
        echo 'httpd.draw STACK'
        echo 'httpd.type GAUGE'
        echo 'commited.label committed'
        echo 'commited.min 0'
# commitグラフの表示設定「線(太さ2)表示」
        echo 'commited.draw LINE2'
        echo 'commited.type GAUGE'
        exit 0
fi

# 実行
echo "httpd.value $GETHTTPDMEM";
echo "clamd.value $GETCLAMDMEM";
echo "commited.value $GETCOMMITED";
munin-node再起動で作成したプラグインを読み込む

完成したプラグインを/etc/munin/plugins/httpdに設置したら、munin-nodeを再起動してプラグインを認識させます。

# service munin-node restart
Stopping Munin Node agents:                                [  OK  ]
Starting Munin Node:                                       [  OK  ]
完成したグラフを見てみると・・・

munin-apache_and_clamd_graphこのプラグインを仕掛けて約3ヶ月のグラフがこちら。clamdは少しずつではありまさすが確実にメモリ使用量が増えていますね・・・・。
またコミットされたメモリ量(Committed_AS)よりもclamdとapacheの合計使用メモリ量の方が多いことがわかりました。Committed_ASは実測値ではなく推定値だからなのかな?Linuxのメモリの読み方は難しいですね。

コメント

  1. 通りすがり より:

    参考にさせてもらいました。ありがとうございます。
    試してみたところ、グラフの描画でエラーが出るので何かと思ったらGUAGE になってました。
    echo ‘httpd.type GUAGE’ が誤字です。
    確認お願いします。

  2. risca より:

    ご指摘ありがとうございます。GAUGE(ゲージ)のつもりがスペルミスをしてましたので修正しました。