apacheのプロセス挙動 †apacheにはworkerプロセスとprefork(MPM)プロセスがある。 workerについて †以下Wikiより抜粋 workerは「マルチスレッドとマルチプロセスのハイブリッド型サーバ」である。 Apacheの子プロセス1つ1つがマルチスレッドで動作し、スレッド1つが1つのクライアントを受け持つ方式である。 すなわち、1つのプロセスがマルチスレッドを利用して複数の通信の面倒を見る。 この点で1つのプロセスが1つの通信をみるpreforkとは異なる。また多くの子プロセスを起動せずに済むため、メモリの使用量も減らすことが出来る。 しかしながらマルチスレッドは安定して動作させるためにノウハウが必要で、モジュールはスレッドセーフである必要があり、 workerを使用する際は事前に十分な安定性のテストを行うべきである。 prefork(MPM)について †preforkは「スレッドを使わず、先行して fork を行なうウェブサーバ」である。Apacheは伝統的に親プロセスを1つ持ち、 クライアントからリクエストが来ると自分自身をコピーして子プロセスを起動する(これをforkという)。 実際の通信は子プロセスが受け持つ。そのため、通信している数だけ子プロセスが起動することになる。 この時、クライアントからリクエストを受けたあとでforkするとfork完了までに待ち時間が出来て通信のパフォーマンスが遅くなる。 そのため、あらかじめいくつかの子プロセスをforkしておき、forkの待ち時間をなくす方式をとっている。 この方式が「prefork」である。すなわち“pre(=前もって・先行して)”forkしておく、という意味である。 preforkのメリットは、forkされた子プロセス1つ1つが対応する通信を受け持つため、ある子プロセスが何らかの原因でフリーズしたとしても、他の子プロセスには影響を及ぼすことが無く通信を継続できる。 このため安定した通信を行うことが出来る。 一方、クライアントが多くなればなるほど子プロセスの数も増えるため、使用メモリ量やCPU負荷が比例的に増大していく。 preforkで多数のクライアントをさばくには、それに応じた大量のメモリと高速なCPUが必要となる。 スレッドセーフでないモジュールを使う場合は、preforkを利用すべきである。
自論 †workerとpreforkについてどっちがいいというのは無理(大抵そうなる)。 ただ、流れとしてはpreforkでは物足りなくなったり、更に良いものを作ろうとした結果がworkerな様な気がするので、正しく使えるのであればworkerで良い気がする。 性能だとかその辺については、ググれば他のエンジニア達がテストしているので出てくるのでそちらを参照してほしい。 おまけ †現在のapacheがどちらで動いているかを確認する方法。 # httpd2 -V Server version: Apache/2.2.13 (Linux/SUSE) Server built: Apr 13 2010 16:28:12 Server's Module Magic Number: 20051115:23 Server loaded: APR 1.3.8, APR-Util 1.3.9 Compiled using: APR 1.3.8, APR-Util 1.3.9 Architecture: 32-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" ####←この辺りを見れば分かる -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=128 -D HTTPD_ROOT="/srv/www" -D SUEXEC_BIN="/usr/sbin/suexec2" -D DEFAULT_PIDLOG="/var/run/httpd2.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_LOCKFILE="/var/run/accept.lock" -D DEFAULT_ERRORLOG="/var/log/apache2/error_log" -D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types" -D SERVER_CONFIG_FILE="/etc/apache2/httpd.conf" 参考URL † |