MPM(Multi Processing Module)。アパッチがリクエストの処理をどのように行うかのいろいろな形態。プロセスを使うものとスレッドを使うものに分けられる。
用いられるMPMはどれかひとつ。
コンパイル時にどのMPMが用いられるか決められる。現状のMPMを確認したい場合は-lをつけてapache2を実行する。
1 2 3 4 5 6 7 8 9 |
$ /usr/sbin/apache2 -l Compiled in modules: core.c mod_log_config.c mod_logio.c prefork.c http_core.c mod_so.c $ |
prefork.cがあるので、preforkであることがわかる。MPMの一覧はここで確認できる。
preforkはスレッドを使わず1.3系のアパッチのようにあらかじめ(pre)プロセスを起動しておく(fork)、それで待機しておく。
アパッチのプロセスは一番偉いコントロールプロセスみたいのがいて、それがアパッチ全体をコントロールしている。このプロセスは終了することがなく、リクエストを処理することもない。
ディレクティブには以下のようなものがある。
StartServers
MinSpareServers
MaxSpareServers
MaxClients
MaxRequestsPerChild
マニュアルを読むと、アパッチは賢いのでデフォルト値で問題ないとのこと、でもMaxClientsは、サーバへのリクエストがすごく多いときには増やし、サーバが重過ぎて動かなくなるときは減らすとのこと。
MaxRequestsPerChildはひとつのプロセスがいくつのリクエストを処理するかを指定するもの、あまり大きいとプロセスがメモリをたくさん使ってしまうのかもしれない。
Windowsのアパッチでも調べてみた。
1 2 3 4 5 6 7 8 |
>httpd.exe -l Compiled in modules: core.c mod_win32.c mpm_winnt.c http_core.c mod_so.c > |
mpm_winntが使われている。これはwinntに特化したモジュールでスレッドを使う。PHPがよく落ちたりするのはスレッドを使っているせいかもしれない。しかしこのモジュールはコンパイル時にしか設定できないので、しかもforkはwindowsにはないので、preforkのwindows版があるのかはわからない。
mpm_winntはひとつの子プロセスをつくり、その中のスレッドですべてのリクエストを受け付ける。そしてこのモジュールにはディレクティブがひとつしかないみたいなのでカスタマイズはほとんどできないと思われる。
windowsのアパッチの起動ログをみてみると、次のようになっている。
1 2 3 4 5 6 7 8 |
[Fri Aug 12 19:58:36 2011] [notice] Apache/2.2.10 (Win32) PHP/5.2.6 configured -- resuming normal operations [Fri Aug 12 19:58:36 2011] [notice] Server built: Oct 10 2008 12:39:04 [Fri Aug 12 19:58:36 2011] [notice] Parent: Created child process 3224 [Fri Aug 12 19:58:37 2011] [notice] Child 3224: Child process is running [Fri Aug 12 19:58:37 2011] [info] Parent: Duplicating socket 124 and sending it to child process 3224 [Fri Aug 12 19:58:37 2011] [notice] Child 3224: Acquired the start mutex. [Fri Aug 12 19:58:37 2011] [notice] Child 3224: Starting 64 worker threads. [Fri Aug 12 19:58:37 2011] [notice] Child 3224: Starting thread to listen on port 80. |
スレッドを64個も作っているらしい。一個でもエラーが出ると、スレッドの場合は全プロセスが落ちるので致命的と思われる。