2014年2月3日月曜日

マルチプロセシングモジュールとかから

Apache HTTPサーバのリクエスト処理は、サーバとしてリクエストを待ち受け、受け付けたリクエストを処理し、応答を返す、という流れを持っている。
そして、この受け付けたリクエストの処理のために別途スレッドを生成するかどうかで、スレッド型かプロセス型かといった区別がある。
Apacheはこの処理の区別をMPM(マルチプロセシングモジュール)という名称でモジュール化し、複数の種別から自由に選択できるようにした。
とは言え、Windows用にはwinnt MPMしかないのではないか(よく知らない)。
このメモではLinuxベースで話を進めるので、Widowsなど他の環境で利用されるMPMについては書かない。知らないからだけど。

ちなみに、Apache 2.0/2.2では使用するMPMの選択は、INSTALLにおけるconfigure時に行っていたが、Apache 2.4では、実行時の設定による選択も可能になった。

Apacheは起動シーケンスにおいて、実行するMPMごとに異なるリクエスト処理方式を採用する。
親プロセスが起動され、共通的な作業として、設定ファイルの読み込みや、各種の初期処理(ログファイルのオープンやリクエスト受付け用のLisnteポートの設置を含む)が行われた後、ループ処理に入り、MPMの主処理を実行する。

prefork MPM

プロセス型でリクエストを処理するMPMとなる。
MPMの主処理内では子プロセスの生成が行われる。
子プロセスはプロセス毎にリクエストの待ち受けの監視、リクエスト受付後のリクエスト処理、レスポンスの送信の一連の処理を行っている。

worker MPM

スレッド型でリクエストを処理するMPMとなる。
MPMの主処理内では、preforkと同様に子プロセスの生成が行われる。
子プロセスはプロセス内でリクエスト待ち受けの監視用のリスナスレッドを1つと、受け付けたリクエストを処理しレスポンスを返すワーカスレッドを1つ以上用意する。
受け付けられたリクエストはスレッドで共有されたワーカーキューを介して、リクエスト待ちにあるワーカスレッドに引き渡される。

event MPM

スレッド型でリクエストを処理するMPMとなる。
worker MPMでは、HTTP keep-alive機能を利用した場合に、リクエスト処理ワーカスレッド
が次のリクエストを受け取るまで処理待ち状態のまま保持されてしまう。つまり、本来リ
クエスト処理可能なワーカスレッドのリソースが無駄になっている
そこで、無駄になっているワーカスレッドのリソースをkeep-alive状態でのリクエスト待ちから解放し、新たなリクエストの処理を受け入れられるようにしたものが、event MPMということ(コメントを読む限りはね)。


ここまで

0 件のコメント:

コメントを投稿