라이프로그


プロセスとスレッドの違いから、preforkとworkerを理解 IT

まず、プロセスプログラム実行時に固有のメモリ空間を持ち、独立性の高い実行単位である為、起動やプロセス切替の時間を必要とします。これに対して、スレッドはメモリ空間を複数のスレッドで共有する為、起動やスレッド切替の時間がそれ程、大きくありません。

先程、preforkはマルチプロセス型、workerはマルチスレッド&マルチプロセスと紹介しましたが、これらを図で表すと次のようになります。

(久しぶりにvisioで描いてみました)

f:id:end0tknr:20090107055845p:image

ちなみに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の確認方法

mpmmoduleとしてinstallされる為、install済のmpmは ./httpd -l で確かめることができます。

[endo@colinux ~]$ cd local/apache/bin[endo@colinux bin]$ ./httpd -lCompiled 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 -lCompiled in modules:  core.c  mod_win32.c  mpm_winnt.c  http_core.c  mod_so.c

1 2 3 4 5 6 7 8 9 10 다음