1GBしかないVPSサーバのメモリを有効利用するために、最も使用率の高いapacheとclamdのメモリ使用量をグラフ化するmuninプラグインを作成してみました。
使用量を計算するコマンドを組み立てる
まずは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 ]
完成したグラフを見てみると・・・
このプラグインを仕掛けて約3ヶ月のグラフがこちら。clamdは少しずつではありまさすが確実にメモリ使用量が増えていますね・・・・。
またコミットされたメモリ量(Committed_AS)よりもclamdとapacheの合計使用メモリ量の方が多いことがわかりました。Committed_ASは実測値ではなく推定値だからなのかな?Linuxのメモリの読み方は難しいですね。
コメント
参考にさせてもらいました。ありがとうございます。
試してみたところ、グラフの描画でエラーが出るので何かと思ったらGUAGE になってました。
echo ‘httpd.type GUAGE’ が誤字です。
確認お願いします。
ご指摘ありがとうございます。GAUGE(ゲージ)のつもりがスペルミスをしてましたので修正しました。