ApacheのMPMはprefork,worker,eventのどれを選ぶべきか?



この種類については、いくつか情報はある。

MPMの種類の理由

しかし、なぜこんなに種類があるのか、その理由と、どれを選択すべきかの説明は、ほとんど日本語情報が無いようだ。

Apache Prefork, Worker and Event MPM analysisに若干の説明があるので、これをもとに解説してみる。

prefork

この多重処理モジュール (MPM) は、スレッド化されていないの派生型ウェブサーバを実装しており、 Apache 1.3 と同様の動作をする。スレッドセーフなライブラリを持たず、スレッドの互換性問題を回避する必要のあるシステムに適している。各リクエストが互いに独立であることが要求され、あるリクエストで問題が発生しても他のリクエストに影響しないような場合に最適なMPMである。

このMPMは自己調整能力が高く、わずかな設定で調整することができる。最も重要なことは、MaxClientsSetを、潜在的なリクエストのピークに対応できるような十分大きな値にすることだが、使用する必要のあるメモリが物理メモリのサイズを超えるほど大きくはならない。

worker

このMPM(Multiple Processing Module)により、Webサーバはマルチスレッドとマルチプロセシングの混在をサポートできる。スレッドを使ってリクエストを処理するため、大量のリクエスト処理ができ、システム資源のオーバーヘッドもプロセスベースのMPMに比べれば少なくなる。しかしまた、プロセスベースのMPMの安定性を得るために、複数のプロセスを使用し、各プロセスが複数のスレッドを持つ。

各プロセスが持てるスレッドの数は固定している。サーバは負荷に応じてプロセス数を増減させる。子プロセスの確立は別の制御プロセス(親プロセス)が担当する。各子プロセスはThreadsPerChild数のサービススレッドとリスナースレッドを確立できる。リスナー・スレッドはアクセス・リクエストを聞き、それをサービス・スレッドに渡して処理・応答する。

WorkerだろうがPreforkだろうが、Apache は来るべきリクエストに対応するため、常にいくつかの予備 (spare) やアイドル状態の子プロセス (idle service thread pool) を保持しようとする。これにより、クライアントはサービスを受ける前に子プロセスの 生成を待つ必要がなくなる。

event

上記の二つの安定したMPM方式は、非常に忙しいサーバアプリケーションの下では、いくつかの欠点がある。HTTP のKeepalive方式は、TCPコネクションの数とネットワーク負荷を減少できるが、 Keepalive はサービスプロセスやスレッドにバインドする必要があり、ビジーなサーバではすべてのスレッドを消費してしまうという問題がある。イベントMPMは、この問題を解決するための新しいモデルである。これは、サービスプロセスと接続を分離するものだ。サーバの処理速度が非常に速く、クリックスルー率が非常に高い場合、利用可能なスレッドの数が重要なリソース制限となる。このときは、Event MPM方式が最も効果的だ。Worker MPM で動作するビジー状態のサーバは、1秒間に数万回のアクセスに耐えられるが(例えば、大規模なニュースサービスサイトのピーク時)、Event MPM では、それ以上の負荷に対応することが可能である。なお、Event MPMは、セキュアなHTTP(HTTPS)アクセスでは動作しないので注意が必要だ。

Event モードでは、apache は次のような警告を出す。

This MPM is experimental, so it may or not work as expected .

この MPM は現在実験的な状態であり、期待通りに動作しないかもしれない。

小さなサーバでの用途

当然だが、大規模なサーバではそれなりのエンジニアがおり、こんなことは詳しくしっているはずで、ここで、こんなことを説明している理由は、小規模なサーバでの問題解決のためである。

その問題とは、「(大規模に比較すれば)大してアクセスが無いのに、メモリだけ大食らいしてしまう」ということだ。実際、デフォルトの設定でapacheを動かしていると、数日後にはメモリが満杯になってしまうのである。もちろん、メモリが数Gレベルの話である。

preforkかworkerかと言えば、workerである

workerはスレッドを利用するため。メモリ使用量が削減される。preforkを利用する理由は、「スレッドセーフなライブラリを持たず、スレッドの互換性問題を回避する必要のあるシステム」があるからであり、現代の環境では考えなくて良いだろう。

workerかeventかと言えば、eventであるが。。。

ただし、httpsでは動作しないのだそうだ。httpの時にだけ動作可能ということである。

未分類

Posted by ysugimura