4.1.2 HTTP Serverのプロセス構造(UNIX版かつworker MPMモジュールの場合)
- 〈この項の構成〉
(1) プロセス構造
HTTP Serverのプロセス構造を次に示します。
HTTP Serverを起動すると,制御プロセスが起動します。制御プロセスは,リクエストを処理するサーバプロセスを起動し,その稼働を監視します。サーバプロセスはメインスレッドのほかに,一つのリスナースレッドとThreadsPerChildディレクティブで指定した数だけサーバスレッドを起動します。サーバプロセス数の最大値は,ServerLimitディレクティブで指定します。
クライアントからのTCP接続は,Listenディレクティブで指定したIPアドレスとポートからOSが受信して,OS内のListenキューに保留します。Listenキューのサイズは,ListenBacklogディレクティブで指定できます。Listenキューに格納できなかったTCP接続は確立されません(このとき,HTTP Serverはクライアントにステータスコードを返却しません)。Listenキューに格納されたTCP接続は,サーバプロセスのリスナースレッドが一つ取り出してサーバプロセス内のキューに登録します。そのあと,サーバスレッドがサーバプロセス内のキューから取り出して処理を行います。サーバプロセス内のキューは,ThreadsPerChildディレクティブで指定した数だけ登録できます。
制御プロセスは,HTTP Serverを起動したユーザ,グループ権限で動作します。サーバプロセスは,User,Groupディレクティブで指定したユーザ,グループ権限で動作します。制御プロセスおよびサーバプロセスともに,プロセス名(実行プログラム名)はhttpsdです。制御プロセスのプロセスIDは,PidFileディレクティブに指定したファイルに出力します。
また,HTTP Serverのリバースプロキシ機能を使用した場合,バックエンドサーバとの間にコネクションが確立されます。そのコネクションの最大数については,「4.7.4(5) 性能に関する注意事項」を参照してください。
(2) プロセス数・スレッド数の遷移
メンテナンスは,サーバの負荷集中を避けるために,1秒ごとに2n−1(nは連続メンテナンス実行回数,6以上はn=6)個ずつサーバプロセスを生成します。サーバプロセスは,MinSpareThreadsディレクティブで指定した数の待ち状態のサーバスレッドができるか,または全サーバスレッド数がMaxClientsディレクティブで指定した数になるまで生成されます。1回のメンテナンスで8個以上のサーバプロセスを生成した場合は,エラーログ(infoレベル)にその旨出力します。
リクエストの処理が終了すると,サーバプロセスは待ち状態になります。待ち状態のサーバスレッドがMaxSpareThreadsディレクティブの値を超えて増加すると,メンテナンスのタイミングでサーバプロセスを終了させます。
(a) 留意点
-
worker MPMではサーバスレッド数に比例して,CGIプロセスの生成処理にコストが掛かり性能が劣化します。そのためCGIプログラムを実行する場合には,prefork MPMを使用することを推奨します。
-
StartServersディレクティブには,Webサーバの起動・再起動直後から大量のリクエストを処理しなければならないような場合は,大きな値を指定してください。
-
Webサーバを起動したあとのプロセス数は,MaxSpareThreadsおよびMinSpareThreadsディレクティブによって制御されるため,StartServersディレクティブ指定値は意味がありません(HWSKeepStartServersディレクティブでOnを指定した場合を除く)。MinSpareThreadsおよびMaxSpareThreadsディレクティブは,急にリクエストが多発しても対応できるように待ち状態のサーバスレッド数を調整するために指定します。プロセスのメンテナンスでエラーログ(infoレベル)が頻繁に出力されるような場合には,待ちプロセス数を増やすよう調整してください。
-
より多くのサーバプロセスを常時待ち状態にしておくと,より多くのクライアントからの同時接続要求を受け付けられます。しかし,それだけサーバリソースを消費するために注意が必要です。
-
すべてのサーバプロセス内のキューが満杯となった場合は,ListenBacklogディレクティブの指定によって,Listenキューに保留されます。
-
一つのサーバプロセスは,MaxRequestsPerChildディレクティブで指定された回数のリクエスト処理を実行したあと,終了します。ただし,MaxRequestsPerChildディレクティブに0を指定した場合,リクエスト処理の回数でサーバプロセスが終了することはありません。MaxRequestsPerChildディレクティブの指定は,エンドユーザが作成したアプリケーションプログラムなどでメモリリークを起こすおそれがある場合に有効です。
-
サーバプロセスに異常終了シグナルが送信された場合(API接続モジュールで障害になった場合も含む),プロセスは,エラーログ(noticeレベル)にそのことを出力します。noticeレベルのエラーログは,LogLevelディレクティブの指定に関係なく出力されます。
-
StartServersディレクティブで指定した数のサーバプロセスを,MaxSpareThreads,MinSpareThreadsディレクティブの指定に関係なく,常に起動しておきたい場合,HWSKeepStartServersディレクティブでOnを指定してください。サーバプロセス数がStartServersディレクティブで指定した数を下回った場合に,新しいプロセスを生成して回復します。
-
HTTP Serverが停止するとPidFileディレクティブに指定したファイルは削除されます。しかし,HTTP Serverを停止しないでマシンをシャットダウンした場合など,HTTP Serverが外部から強制的に終了させられたときには,PidFileディレクティブに指定したファイルは削除されないで,次回のHTTP Serverの起動に失敗する場合があります。HTTP Serverが起動していない状態でPidFileディレクティブに指定したファイルが存在する場合は,このファイルを削除してからHTTP Serverを起動してください。
-
HTTP/2プロトコルを使用している場合は,サーバスレッドのほかにHTTP/2プロトコルを処理するためのワーカスレッドが生成されます。詳細は「4.17.3 ワーカスレッド」を参照してください。
(b) プロセス数・スレッド数の遷移例
プロセス数・スレッド数の遷移例を図4-5に示します。
-
ディレクティブの指定値
LoadModule mpm_worker_module libexec/mod_mpm_worker.so ServerLimit 3 StartServers 1 MinSpareThreads 4 MaxSpareThreads 12 ThreadsPerChild 5 MaxClients 15
図4‒5 プロセス数・スレッド数の遷移例