apache2のMPM覚書

MPM(Multi Processing Module)。アパッチがリクエストの処理をどのように行うかのいろいろな形態。プロセスを使うものとスレッドを使うものに分けられる。

用いられるMPMはどれかひとつ。

コンパイル時にどのMPMが用いられるか決められる。現状のMPMを確認したい場合は-lをつけてapache2を実行する。

prefork.cがあるので、preforkであることがわかる。MPMの一覧はここで確認できる。

preforkはスレッドを使わず1.3系のアパッチのようにあらかじめ(pre)プロセスを起動しておく(fork)、それで待機しておく。

アパッチのプロセスは一番偉いコントロールプロセスみたいのがいて、それがアパッチ全体をコントロールしている。このプロセスは終了することがなく、リクエストを処理することもない。

ディレクティブには以下のようなものがある。
StartServers
MinSpareServers
MaxSpareServers
MaxClients
MaxRequestsPerChild
マニュアルを読むと、アパッチは賢いのでデフォルト値で問題ないとのこと、でもMaxClientsは、サーバへのリクエストがすごく多いときには増やし、サーバが重過ぎて動かなくなるときは減らすとのこと。

MaxRequestsPerChildはひとつのプロセスがいくつのリクエストを処理するかを指定するもの、あまり大きいとプロセスがメモリをたくさん使ってしまうのかもしれない。

Windowsのアパッチでも調べてみた。

mpm_winntが使われている。これはwinntに特化したモジュールでスレッドを使う。PHPがよく落ちたりするのはスレッドを使っているせいかもしれない。しかしこのモジュールはコンパイル時にしか設定できないので、しかもforkはwindowsにはないので、preforkのwindows版があるのかはわからない。

mpm_winntはひとつの子プロセスをつくり、その中のスレッドですべてのリクエストを受け付ける。そしてこのモジュールにはディレクティブがひとつしかないみたいなのでカスタマイズはほとんどできないと思われる。

windowsのアパッチの起動ログをみてみると、次のようになっている。

スレッドを64個も作っているらしい。一個でもエラーが出ると、スレッドの場合は全プロセスが落ちるので致命的と思われる。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)