ApacheのMPMについて調べたこと

さくらVPSで運用しているWEBサーバーの1つが割り当てられた
物理メモリ512MBとSWAP2.5Gを10分程度で食いつぶし落ちてしまう為、調査。

調査の流れ↓

vmstat で swapの値が大幅に大きくなっていることを確認

sar -u でCPU使用率を確認するもidle96%程度でほぼCPU負荷なし

sar -r でメモリ利用率を確認するとmemusedが98%をさしている状態。

ps alx でプロセス毎のメモリ使用量を確認すると/usr/sbin/httpdが30個程度それぞれ55MB程度占有している様子

apacheがメモリを食いつぶしスワップを発生させている

改善するところ

ApacheのMPMの見直し。

1度生成されたプロセスはapache再起動するまで残ったまま。
そのため、できるだけ最大のプロセスを減らす。

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   10(元20)
ServerLimit       15(元256)
MaxClients        15(元256)
MaxRequestsPerChild  50
<IfModule>


KeepAliveを有効に。
KeepAlive On
同一クライアントに対してコネクションを使い回す
MaxKeepAliveRequests 100

MPMの種類を確認

# /usr/sbin/httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

MPMについて調べたこと。

ApacheHTTPサーバーではリクエストを処理する部分のことを指す。(2.0以降採用)
(参考)
http://d.hatena.ne.jp/j7400157/20070609/1181318102
http://labs.unoh.net/2008/03/apache_mpm.html

MPMの種類は4つある
prefork
worker
perchild
winnt

Prefork MPMについて。

特徴!
1.1つのリクエストについて1プロセス(fork:プロセス起動)割り当てる。(スレッド使用しない)
2.負荷に応じて子プロセスを増減させる。
3.PHP で使うとき必要。(preforkMPM推奨、workerMPMは非推奨)

メリット
あるプロセスがフリーズしても他に影響ない

デメリット
リクエスト数増加>プロセス増加>重い

デフォルトの値はこうなっている↓

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

PHPの場合、MaxRequestsPerchildは50程度に抑えると〇。
PHPを使っているとメモリを消費するため、頻繁に子プロセスを生成しなおしたい為。
preforkMPMを使用する場合、大量のアクセスを裁きたい場合、 MaxClientsを増加。
メモリ不足に陥る場合があるので注意。

WorkderMPMについて

特徴!
1.スレッド対応型
2.リクエスト処理はスレッドが対応する
3.負荷に応じて子プロセスを増減させる
4.1子プロセスあたりのスレッド数は固定になっている

リクエスト処理をスレッドが対応することが特徴。
子プロセスを生成したとき、リクエスト処理をするスレッドを最初にすべて生成する>
よって子プロセスの生成を待つ必要がないので、preforkMPMよりパフォーマンス良い。

メリット
プロセス数を減らせる
デメリット
1つのスレッドの動作がおかしくなると他のスレッドも道連れになる為不安定。

デフォルト値
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

プロセスとは>>1つのプログラム
スレッドとは>>1プロセス内部に生成される処理単位


(参考)
http://blog.harapeko.jp/2010/11/05/apache-webdav-setting/