Custom Search

JITAKU_SVR_Wiki

apacheのプロセス挙動

apacheにはworkerプロセスとprefork(MPM)プロセスがある。
(実際には3種類目にeventと言うのがあるが、まだ研究中のため実用しないほうがいいらしい。詳しくはwikiで。最下部リンク。)

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で良い気がする。
と言うのもデフォルトで動いているのがpreforkなので、今のところ自分の環境ではworkerがないということもありpreforkをおすすめ。
ちなみに環境は
OS:OpenSuSE11.2(i586)
apache:パッケージでインストールした「apache2-2.2.13-2.4.1.i586」。

性能だとかその辺については、ググれば他のエンジニア達がテストしているので出てくるのでそちらを参照してほしい。

おまけ

現在の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

http://ja.wikipedia.org/wiki/Apache_HTTP_Server


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-17 (木) 16:31:28 (707d)