これまでも何度か発生&対処してきたサーバーが、やはりおかしい。
Apache(httpd)やPostfixなどが、いつの間にか停止しているのです。
これらはサーバとしては標準的なソフトウェアで、こんなに頻繁に停止するようなバグがあれば、とっくに対策されているはずなのに。
調査
それぞれのソフトが残すログは、これまでも何度も調べてきました。
そこで今回は視点を変えて、全体を俯瞰的に見てみることにしました。VPS全体のメモリ使用状況との因果関係を調べてみることにしました。
使ったのは free コマンド。メモリの使用量を調べるコマンドです。
#! /bin/sh
PREV=0
while true
do
CUR=`free -m | sed -ne '
/Mem:/s/[^0-9]\{4,\}[0-9]\{1,\}[^0-9]\{1,\}\([0-9]\{1,\}\).*/\1/p
'`
if test `expr ${CUR} / 10` -ne `expr ${PREV} / 10`
then
echo `date +'%Y-%m-%d %H:%M:%S'` ${CUR}
PREV=${CUR}
fi
sleep 1
done
こちらのスクリプト、簡単に書くと1秒ごとにメモリ使用量を調べて、10MB以上変化したら出力する、というもの。これを動かして、不具合が出るまでひたすら待つことにしました。
意外な仕様が!
進展は意外なところからもたらされました。別件で調べ物をしていたときのこと。
お名前VPS の「よくある質問」の中に 「httpd やpostfix などのサービスが停止してしまいました」なんてのが。
重要な点を抜粋すると
「お客様の利用メモリー数が上限を超えてしまった場合、自動でサービス停止が発生」
するとのこと。
さらに、利用メモリの上限を お名前VPSの トップページにある 1GB だとばかり思っていたのですが、よくよく読んでみると
各VPSには基本メモリとして512MBが割り当てられています。ハードウェアのリソースに余裕がある場合は最大1GBまで割り当てられます。
ということでした(機能詳細より)。
つまり、保証されいてるのは512MBまでということのようです。
今のところ、殆どの時は1024MBが割り当てられており、メモリ使用量は(前述の調査用スクリプトによると)400~550MB程度だったので、通常は問題なく動いていたのでしょう。
ところが、全体のリソースが不足して、割り当てが512MBになると、サーバプロセスが強制終了させられる、というカラクリです。
不平
よく読めば書いてあることを見落としていた点はこちらの落ち度としても(←一歩譲ってですよ)、「自動でサービスが停止」とは、いったいどういう仕様なんだい?
遅くなってもいいから動き続けてもらわないと困るでしょう。
そもそも標準で動くサーバだけで500MB近く消費しておいて、512MB超えたら停止ってのはいかんでしょう。
しかも「よくある質問」にあるということは、よくあることなんでしょう?サービスが自動で停止されるってことが。
きっと「1GBまで保証するオプションを申し込んじゃえばいいじゃん!」ということなのでしょうが。
挑戦
なんか、このまま1GBメモリオプションを申し込むのは悔しいので、不要なサービスを止めることにしました。
ところが、一番無駄にメモリを消費している amavisd (ウィルスメールフィルタ)を止めると、mailman (メーリングリスト管理システム)が動かない。たぶん設定をいじればいいのだろうけど、そんな時間はない。
なので、たいして止められませんでしたが通常時で350~500MBの消費まで抑えることができました。
それでも、ピーク時には512MBを超えることが予想できます。
なので、一定時間ごとに「各サーバの稼働状況を調べて、停止していたら動かす」というスクリプトを動かすことにしました。
「そっちが勝手に止めるんなら、こっちは勝手に動かすよ」作戦です。
特にApacheは、再起動後はメモリ使用量が大幅に減るので、再起動後は上限の制約にひっかからなくなります。
もっとも、頻繁に停止させられると、こちらとしてもサービスの信頼性が悪くなるので、過信はできません。
近い将来、1GBオプションを申し込まないとならないのでしょう・・・。
それにしても
それにしても、ちょっとしたパソコンでも物理メモリが4GBとか搭載されているこのご時世に、メモリ(しかも仮想メモリの上限)の制約でこれほど苦しめられるとは、思いもしませんでした。