Apache サービスを起動すると、httpd プロセスが複数生成されます。各プロセスはクライアントからの http リクエストを受け付け、処理を行いクライアントへレスポンスを返します。
プロセスを複数生成することで同時にリクエストを処理することができるようになります。これを実現するモジュール(追加機能)のことを Multi Processing Module , 略して MPM と呼びます。
Linuxを使用する際、MPM には 3 つの方式が存在します。prefork / worker / event となります。
それぞれの特徴は以下のようです。
prefork
prefork では 1 つのプロセスが 1 つのスレッドを持ちます。スレッドとは CPU に命令を渡す単位です。つまり、1 つの httpd は 1 つの CPU コアを使ってリクエストを処理します。このようなプロセスを「シングルスレッドプロセス」と呼びます。
prefork の意味は、「アクセスが増えてきたら前もって (pre) fork する」ということですが、worker であっても event であってもこれは同じです。
※fork とは Linux のシステムコールの 1 つで、プロセスから別のプロセスを呼び出すことです。(このケースでは、ある プロセス ID を持つ httpd が、別のプロセス ID となる httpd プロセスを生成することです。)
worker
このモードでは、Apacheはマルチプロセスとマルチスレッドの両方を使用して接続を処理します。各Apacheプロセスは多数のスレッドを生成し、それぞれのスレッドが接続を処理します。Worker MPMは、メモリの使用を最小限に抑えつつ大量の同時接続を処理する能力を向上させるために設計されています。
eventモードとの大きな違いは、keep-aliveの制御権はワークスレッドにあり、keep-alive接続中、スレッドは専有されます。
event
Event MPMは、Worker MPMを基にして開発されましたが、keep-alive接続の処理方法が異なります。keep-alive接続に対してWorker MPMでは接続が終了するまでスレッドが専有されるのに対して、Event MPMでは接続が再度活性化するまでスレッドを解放します。これにより、大量のkeep-alive接続を効率よく処理しながらリソースの消費を最小限に抑えることができます。
workモードとの大きな違いは、レスポンス後はコネクションの管理をリスナースレッドに返し、別のリクエストを受け付けられます。ワークスレッドの利用を最大化できます。
workとeventはどれを選択するか
どちらのモードを選択するかは、サーバのリソースとトラフィックパターンによります。しかし一般的には、同時接続数が非常に多い場合や大量のkeep-alive接続がある場合には、Event MPMの方がパフォーマンスが良いとされています。
コメント