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/