RubyでTwitter bot を書くがプチ人気になって、突発的にアクセス数が増えました。ありがたいことです。
そうこうしてるうちに、Mac miniで動かしてるサーバからの応答がぷっつりになってしまいました。リビングに行ってみると、HDDがガリガリガリと鳴り続けてます。ああ、いつものスラッシングか、と。ApacheLogPatchをつくったときなんかも、同じことが起こってました。でもあきらめて電源ブチっとしてました。なんという…
今日は一念発起して、なんとかすることにしました。いつまでも電源ブチでは壊れてしまいます。
状況確認
なにが起こってるかをtopで確認してみます。
512MBしかメモリのないMac miniで、504MBが使用中になっており、いかにもslashingです。
Apache restart
ひとまず、止めてしまおうと
% apachectl restart
と打ってみたのですが、いっこうに返ってきません…
状況確認 2
% ps xa |grep httpd | wc
してみたら、60くらいのhttpdがいることが分かりました。
1つのhttpdが使うメモリが8〜10MBだとすると、合計で480〜600MBのメモリが必要になってしまい、総容量を越えてしまう、というわけでした。
Apacheの設定を見直す
同時接続プロセス数が多いのが原因だと分かったので、制限してみます。
@IT::httpd.confによるWebサーバの最適化 という記事を読んで、MaxClientsというものを指定すればよいことを知りました。なるほど。 うちの場合は、だいたいhttpdにさける総メモリを450MB、1つのhttpdが使うメモリを10MBと見積もって、450/10 = 45 clients と算出しました。
MacPortsで入れているApache2の設定ファイルで、conf/extra/httpd-mpm.conf というものをincludeするようにして、
<ifModule mpm_prefork_module>
....
MaxClients 45
MaxRequestsPerChild 4098
</ifModule>
としておきました。
まとめ
自宅サーバはラクじゃないね。
おまけ
Mac OS Xで、コマンドラインから動いているプロセスの使用メモリを見る方法を、top以外にこれまで知らなかったのですが、man psしてみたところ -vとか-uをつければよいと知りました。メモリ消費量でソートするには-mをつけると。

日本語
English