はじめに
Multi Processing Moduleという名称からも分かるように、mpmとはapacheの並列処理を行うmoduleです。
apacheのmpmには、マルチプロセスのpreforkと、マルチスレッドのworker(※)がありますが、今回はこれらについてまとめてみます。
※正しくはworkerではマルチスレッドに加えマルチプロセスも使用しています
尚、mpmの詳細な解説は次のurlをご覧下さい。
http://httpd.apache.org/docs/2.0/ja/mpm.html
プロセスとスレッドの違いから、preforkとworkerを理解
mpmを紹介する前に、プロセスとスレッドを理解する必要があると思います。
まず、プロセスはプログラム実行時に固有のメモリ空間を持ち、独立性の高い実行単位である為、起動やプロセス切替の時間を必要とします。これに対して、スレッドはメモリ空間を複数のスレッドで共有する為、起動やスレッド切替の時間がそれ程、大きくありません。
先程、preforkはマルチプロセス型、workerはマルチスレッド&マルチプロセスと紹介しましたが、これらを図で表すと次のようになります。
(久しぶりにvisioで描いてみました)
ちなみにmpm=workerの場合も、1プロセスあたりのスレッド数は固定されており、リクエスト数に応じてプロセス数を増減させます
私の場合、安定性のprefork
http://httpd.apache.org/docs/2.0/ja/mpm.html
httpd.apache.orgのドキュメントによれば、preforkとworkerの選択基準を次のように記載しています。
例えば、非常に大きなスケーラビリティを必要とするサイトでは、 worker といったスレッド化された MPM を利用できる一方で、 安定性や古いソフトウェアとの互換性を必要とするサイトでは prefork が利用できます。
また、リバースプロキシを使用して、APサーバにはperfork、静的file(js,css,img etc.)にはworkerに振り分ける構成もあるようです。
ただし、preforkと比較してworkerのパフォーマンスやスケーラビリティが極端に優れているとは思えない為(正確に測定したことはありません)、apサーバも静的fileもpreforkを利用しています。
mpmを指定したapacheのinstall
linuxのディストリビューションによっては、preforkとworkerの2種類のapacheがinstallされているようですが(※)、mpmを変更するには、再コンパイルする必要があります。
※ http://www.turbolinux.co.jp/support/document/knowledge/627.html
$ ./configure --with-mpm=prefork $ make # make install
install済のmpmの確認方法
mpmはmoduleとしてinstallされる為、install済のmpmは ./httpd -l で確かめることができます。
[endo@colinux ~]$ cd local/apache/bin [endo@colinux bin]$ ./httpd -l Compiled in modules: core.c mod_access.c mod_auth.c mod_include.c mod_log_config.c mod_env.c mod_setenvif.c prefork.c #←ココ http_core.c mod_mime.c <略> [endo@colinux bin]$
参考までにwin版のapache 2.2のmpmは mpm_winnt.c が使用されています。
$ ./httpd.exe -l Compiled in modules: core.c mod_win32.c mpm_winnt.c http_core.c mod_so.c