第 6 章 実装 40
6.2 Apache ウェブサーバの構成
Apache ウェブサーバ
提案機構
Linux
標準ライブラリ (libc)
カーネル空間 ユーザ空間
横取り・書き換え libc 呼び出し
システムコール発行
図 6.1: 実装の概要
に実装しており,ここではそれについて説明する.
6.2.1 Apache のプロセス構成
Apacheのサーバ内部構成を図6.2に示す.Apacheでは,クライアントからの接
続を受け付ける接続待ちキューとリクエストを処理するための複数のリクエスト 処理プロセス,全体の調整を行うメインプロセスから構成される.
リクエスト処理プロセスはアイドル状態になると接続を受け付けるaccept()シ ステムコールを呼び出し,接続待ちキューから接続を取りだし,その接続のリクエ スト処理を担当する.そのプロセスはその接続専用にリクエスト処理を行い,他 の接続のリクエスト処理を行うことはない.それぞれのリクエスト処理プロセス はHTTPリクエストをクライアントから受信するたびに処理を行い,要求された ファイルをクライアントに返信する.このリクエスト処理は,繰り返し行われる.
接続がクライアント側から明示的に切断されたり,最後のリクエスト処理が完 了してから次のリクエストを受信しない期間が持続的接続時間を超えると接続を 切断し,そのリクエスト処理プロセスは再びアイドル状態になる.アイドル状態 になると再度accept()を呼び出し,新たな接続を待つ.
リクエスト処理プロセスの最大数を決定するのが最大クライアント数パラメー タである.ApacheではMaxClientsである.クライアントからの接続とリクエス ト処理プロセスが1対1に対応するため,プロセス数は最大クライアント数を超 えることはない.
接続待ち キュー
プロセス1
プロセス2 プロセス3 プロセス4
リクエスト処理プロセス accept()
最大クライアント数の範囲内で Apacheはプロセス数を増減させる.
図 6.2: Apacheの内部構成
6.2.2 Apache 内部のプロセス数調整機構
Apacheは最大クライアント数を超えない範囲で,リクエスト処理プロセスの数
を増減させる.メインプロセスがこの処理を担当する.Apacheによるこの機構は,
本論文の最大クライアント数のパラメータ設定機構とは異なっている.本論文で はサーバの処理能力に応じて最大クライアント数を制限するのに対して,Apache では単にクライアントからの要求のみを監視し,サーバの処理能力に関わらず要 求が増加していればプロセス数を増加させる.そして,生成されたプロセスが暫 くリクエスト処理をしなければ,一定数までプロセス数を徐々に減少させる.
Apacheのこの機能のため,ある最大クライアント数の値を使用した場合のサー
バ性能を正確に測定するためには,プロセス数を常に監視し,プロセス数が最大 クライアント数付近の時のみ性能を測定するようにしなければならない.Apache では,プロセスの生成と破棄のためfork(),exit()システムコールが用いられて いる.
6.2.3 リクエスト処理プロセス内のリクエスト処理
次に,それぞれのリクエスト処理プロセス内での処理の流れについて説明する.
その流れを図 6.3に示す.
各リクエスト処理プロセスでは,まずaccept()システムコールを呼び出しクラ イアントとの間に接続を確立したあと,最初のリクエスト処理を行う.そのリク エスト処理が完了したあと,poll()システムコールを呼び出し次のリクエストの 到着を待つ.poll()はネットワークやディスクの入出力を監視するためのシステ
Apache
Linux accpet() poll() close()
1. TCP接続の 受付
経過時間 2. HTTP要求の
処理
3. 要求の 待受け
接続の 切断 タイムアウト
poll() 5. 要求の
待受け 4. HTTP要求の
処理
図 6.3: Apacheのリクエスト処理プロセスにおける処理の流れ
ムコールであり,呼び出すと入出力があるまで待機し,制御は戻らない.入出力 があった場合に始めて制御が戻る.Apacheでは,リクエストが到着したことを監 視するためにpoll()を利用しており,poll()から制御が戻るとリクエスト処理 を行い,またpoll()を呼び出し,次のリクエストの到着を待つ.
接続の切断は,最後のリクエスト処理が完了してからリクエストが到着しない 時間が持続的接続時間KeepAliveTimeoutを超えた場合に行われる.持続的接続
時間はpoll()システムコールのタイムアウト時間として引数で指定されており,
poll() で待っている時間が持続的接続時間を超えると,接続の切断処理を行い
close()システムコールを呼び出す.
6.2.4 Apache の他のリクエスト処理モデル
Apacheのコンパイルのデフォルト設定では,プロセスのみをリクエスト処理に
使用するprefork Multi Processing Module (MPM)と呼ばれる処理モデルが使用 されている.コンパイルに明示的に指定することで,プロセスとスレッドを組み
合わせたworker MPMなど複数の処理モデルから選択可能になっている.
本論文の実装は,デフォルトであるprefork MPMを対象に作成しているが他の モデルに対しても容易に対応することができる.例えば,worker MPMでは,ク ライアントからの接続に対してプロセスの代りにスレッドが割り当てられるため,
プロセスの生成と破棄に関するシステムコールの代りにスレッドの生成と破棄に 関する呼び出しをフックすれば対応することができる.最大クライアント数はス レッドの総数の最大値に対応しており,最大クライアント数設定のために本機構 をそのまま利用することができる.
本論文の提案機構
共通コンポーネント 持続的接続時間
設定コンポーネント 最大クライアント数 設定コンポーネント
ログ機能,
時間計測,
統計計算などの 共通機能を提供
持続的接続時間 設定のための アルゴリズムの提供
最大クライアント数 設定のための アルゴリズムの提供
上位機構
環境依存コード 環境依存コード 環境依存コード 下位機構
図 6.4: パラメータ自動設定機構の詳細な構成