end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

apache2.0のMPM ( Multi Processing Module ) とは

はじめに

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