このブログはVPSで動かしているのですが、度々、メモリ不足に陥ってダウンすることがありました。今まで、このことについては再起動すれば直るので、気にしていませんでした。しかし、セミナーのサンプルファイルを保護ページで配布するようにしたり、Webサーバーと連携するコードのテストなど、以前よりも落ちていると問題があることが増えたので対策を取ることにしました。
原因調査
まずは、原因調査です。落ちるときの少し前にはwatchdogのログが大量に来ています。このログファイルの中を確認してみると、httpdが沢山起動していることに気がつきました。
[cc]apache 2488 2481 0 11:01 ? 00:00:01 /usr/sbin/httpd
apache 2489 2481 0 11:01 ? 00:00:00 /usr/sbin/httpd
apache 2490 2481 0 11:01 ? 00:00:00 /usr/sbin/httpd
apache 2492 2481 0 11:01 ? 00:00:00 /usr/sbin/httpd
apache 2494 2481 0 11:01 ? 00:00:00 /usr/sbin/httpd
apache 2495 2481 0 11:01 ? 00:00:00 /usr/sbin/httpd
apache 2524 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2526 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2527 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2529 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2530 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2531 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2532 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2533 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2534 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2535 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2536 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2538 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2539 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd
apache 2542 2481 0 11:04 ? 00:00:00 /usr/sbin/httpd[/cc]
そして、最後にはhttpdが再起動しているらしいものも出力されていました。
[cc]Stopping httpd: [ OK ]
Starting httpd: [ OK ][/cc]
VPSの利用可能なメモリに対して、httpdのプロセス数が多く、高負荷状態になっていることが原因の可能性が高そうです。
プロセス数の制限
作成されるプロセス数を制限するには、preforkの設定を変更すれば良いようです。変更するべきパラメータは次のものようです。
- StartServers (起動時に作成される子プロセス数)
- MinSpareServers (アイドル状態の最小子プロセス数)
- MaxSpareServers (アイドル状態の最大子プロセス数)
- MaxClients (応答する子プロセスの最大数)
- MaxRequestsPerChild (子サーバーが処理可能なリクエスト数)
これらのパラメータを調整しました。調整し終わったら、Apacheを再起動して完了です。
結果
調整前はSSHでの接続すらも重い状態でしたが、Apache再起動後、5分くらいで効果が見えてきました。SSHの反応も良くなり、ブログで色々なページを開くときの読み込みも早くなりました。また、watchdogの警告メールも止まりました。