CentOS 5 世代の Apache は、prefork MPM を前提に運用されていることが多く、アクセス数やモジュール構成によって httpd プロセスがメモリを大きく消費することがあります。
この記事では、CentOS 5 の Apache でメモリ不足が起きる場合に、httpd プロセス数を見直す観点を確認します。現在の新規構築ではなく、古い Apache サーバーを読むための内容です。
まずメモリ使用量を確認する
free -m
ps aux | grep httpd
ps -ylC httpd --sort:rssApache のメモリ不足では、1プロセスあたりの RSS と、同時に起動しているプロセス数を見ます。単にアクセスが多いだけでなく、PHP やモジュールの影響で1プロセスが重くなっている場合もあります。
prefork MPM の設定を見る
grep -n 'StartServers\|MinSpareServers\|MaxSpareServers\|MaxClients\|ServerLimit' /etc/httpd/conf/httpd.conf設定例
メモリが少ない環境では、MaxClients を大きくしすぎると、同時接続を捌く前にメモリを使い切ります。
sudo cp -a /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak.$(date +%Y%m%d%H%M%S)
sudo tee -a /etc/httpd/conf/httpd.conf >/dev/null <<'EOF'
<IfModule prefork.c>
StartServers 2
MinSpareServers 2
MaxSpareServers 5
ServerLimit 30
MaxClients 30
MaxRequestsPerChild 1000
</IfModule>
EOFこの値は例です。実際には、1プロセスあたりのメモリ使用量と搭載メモリから逆算します。
設定を確認して反映する
sudo apachectl configtest
sudo service httpd restart
ps -ylC httpd --sort:rss設定変更後は、構文確認、再起動、プロセス数、メモリ使用量を確認します。アクセスが増えた時に swap が増えていないかも見ます。
現在の視点での注意点
古い Apache / PHP 環境では、メモリ不足を MPM 設定だけで解決しようとしても限界があります。アプリケーション側のメモリ使用量、PHP モジュール、キャッシュ、リバースプロキシ化、サーバー移行も含めて考えるべきです。
1 プロセスあたりのメモリから逆算する
Apache のメモリ不足を考える時は、MaxClients だけを見ても不十分です。1 プロセスあたりの実メモリ使用量と、同時に立ち上がるプロセス数から、サーバー全体でどれくらいメモリを使うかを逆算します。
- Apache 1 プロセスあたりの RSS を見る
- 同時接続数と
MaxClientsを確認する - MySQL や他プロセスが使うメモリを差し引く
- スワップが発生していないか確認する
古い CentOS 5 の Web サーバーでは、メモリが少ない環境で Apache、PHP、MySQL が同居していることがあります。その場合、Apache だけを増やすとサーバー全体がスワップして、かえって遅くなります。
ps -ylC httpd --sort:rss
ps aux | grep [h]ttpd
free -m
vmstat 1 5
topApache Status と合わせて見る
Apache Status が有効であれば、メモリ使用量だけでなく、リクエスト処理中なのか、KeepAlive で待機しているのかも確認できます。接続が多いのか、処理が重いのか、待機が多いのかで対処が変わります。
curl "http://127.0.0.1/server-status?auto"
grep -E "MaxClients|StartServers|KeepAlive|Timeout" /etc/httpd/conf/httpd.conf
tail -f /var/log/httpd/error_logまとめ
CentOS 5 の Apache メモリ不足対策では、httpd プロセス数と1プロセスあたりのメモリ使用量を分けて確認します。MaxClients を増やせば性能が上がるわけではなく、メモリに収まる範囲で上限を決める必要があります。
関連する記事
- CentOS 5 サーバー管理ガイド
CentOS 5 系記事のハブです。 - CentOS 5 不要サービスの停止 – chkconfig で起動状態を確認する
サービス管理の基本記事です。 - CentOS 5 ネットワーク設定 – ifcfg と network サービスの基本
Web サーバーの前提になるネットワーク設定です。
参考書籍
古い Linux サーバーの操作や設定ファイルを読む前提として、CLI の考え方を確認したい場合の参考書籍です。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。


感謝noun感謝”]]],”en感謝thanksthanks感謝ありがとうございます