HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

メモリの使用量を気にしながらサーバーを再起動

今月は、ほぼ死に状態で、何もできなかったので、せめてものしょうもない内容で締めようと思う(謎)。

ってな訳で(謎)、あるサーバーのメモリ使用量が気になるが、張り付いている訳にもいかない、そんなときのひとつの手段として、定期的に再起動するようにcron設定をしておくというのはよくあるやり方。
ただ、必要のないときにまでわざわざ再起動することはないじゃん、というのもあるし、どのくらいの周期で再起動をすればいいのかが時間とともに変わってくるということもある。結局は張り付いていなきゃいけないのかということを思ったときにふと思いついたやり方。

他にもっとちゃんとしたやり方があるような気もするがな。まぁ、死にかけの頭の中でふと思いついた程度のことなので、自分へのメモ程度にということで(謎)。


まずは、cronの設定。これは定期的に状況を監視するという意味で、周期はちょっと短めに設定しておく。

*/15 * * * * /root/scripts/httpd-graceful-with-check-memory.sh 2&>1 >> /dev/null

ファイル名から察するに(謎)、中身はApache httpdのgracefulらしい。
‥とまぁ、それはどうでもいいとして。
httpd-graceful-with-check-memory.sh の中身。

#! /bin/bash

# logger: 任意のメッセージをsyslogに書き込むためのコマンド
# loggerコマンドのパスは環境によって異なるので確認すること!!
#logger=/usr/bin/logger
logger=/bin/logger

memUsage=$(($(free | grep '^[-]/[+] buffers' | awk '{printf("100
*%d/(%d+%d)", $3, $3, $4);}')))

if [ ${memUsage} -ge 80 ]; then
    /etc/init.d/httpd graceful
    printf "Memory usage: %3d%%, so servers are restarted. (status: %d)\n" ${memUsage} $? | ${logger} -t httpd-checker -i
fi

ここでは、freeコマンドの出力を使用している。
ローカルでsnmpdが動いているなら、そこに問い合わせた結果を使ってもいいし。
また、再起動記録の出力先にsyslogを使ってみている。

freeコマンドは次のような出力を吐き出す。

             total       used       free     shared    buffers     cached
Mem:        508864     503036       5828          0      60940     228064
-/+ buffers/cache:     214032     294832
Swap:       397304       1508     395796

ずいぶんと貧弱だが、VMware上で動いている、512MBほどのメモリを割り当てた仮想マシンなのでこんなもんです。
freeコマンドの出力なんかは以下のサイトを見るといいかもしれない(のでここでは省略)。

大体、上記の出力例では実質42%ほどを使っていることになる。


あまり細かにメモリ使用量を調べて判定、とかやりだすと、そっちに余計なコストがかかって本末転倒なので、逆に上記のような手抜き簡単なやり方で十分だろうと思う。


機会があったら試してみたいがな(ぉ