Apache MPM(prefork / worker / event)の違いと同時接続数を意識したチューニングによる性能改善

Apacheとは

Apache(アパッチ)とは、正式にはApache HTTP Serverと呼ばれ、世界中で広く使われている オープンソースのWebサーバーソフトウェアです。最近ではnginxの方が市場シェアは上回っていますが、特に国内のミッションクリティカルなシステムでは依然として用いられることが多いソフトウェアですので、インフラエンジニアとしては確実に押さえておきたい内容となります。

参考までにWebサーバーソフトウェアの世界市場シェア(2025年3月時点)の情報を共有します。
Nginx:33.8%
Apache:26.3%
W3Techs – extensive and reliable web technology surveys

Apacheの並行処理の仕組み

ApacheにはMPM(Multi Processing Module)というモジュールにより並行処理を実現することができます。MPMにはprefork、worker、eventと呼ばれる処理方式がありますのでそれぞれ説明します。従来のprefork、workerよりもeventの方が処理性能が高いので、高負荷システムにおいてはeventを採用するのが良いと考えております。下表にそれぞれの方式の概要を記載します。

それぞれの方式の処理イメージを記載します。まずpreforkです。ひとつの子プロセスがひとつのクライアントからのリクエストを処理します。あらかじめ起動しているプロセス数を超えるリクエストが到達した場合は、新しい子プロセスを生成して処理を行います。

workerとeventについてはスレッドでリクエストを処理する方式となります。preforkとは異なり、子プロセスにおける複数スレッドがリクエストを処理します。子プロセスにおけるリスナースレッドで接続を受け付けて、後ろのワーカースレッドで処理を行う流れとなります。リクエストが増えると子プロセスが生成される挙動はpreforkと同様です。

workerとeventの違いはKeepAlive発生時の挙動となります。まずworkerにおける挙動を下図に示します。KeepAlive中はワーカースレッドが待ち状態になってしまうため処理効率が落ちてしまいます。


続いてeventにおけるKeepAlive時の挙動を記載します。workerと異なり、ワーカースレッドの処理が終わったらコネクションを解放して次のリクエストを受け付けることができるので、より効率的にスレッドを使うことができます。

より詳細を知りたい方は、Apache Foundationの公式マニュアルを参照いただければと思います。
https://httpd.apache.org/docs/

※KeepAliveとは
機器間の接続が有効であることを確認するために定期的に行われる通信となります。KeepAliveの応答があるうちは接続を保持することで、接続を確立するために必要なリソースを消費せずに済むという利点がある一方で、接続され続けるとプロセスやスレッドが解放されないというデメリットもあります。両者のバランスを取ってKeepAlive関連のパラメータを検討することが重要です。event方式においてはKeepAliveの処理は別スレッドで処理されますが、大量のクライアントが長期間接続されたままだとリソース影響が起きる可能性がありますので、event方式においても考慮してください。


Apacheのチューニングパラメータ

続いてApacheにおける主なチューニングパラメータを説明していきます。プロセス数や、worker/eventにおいてはスレッド数が同時接続数を制限する重要なパラメータとなってきますので、適切な値を設定するようにしましょう。バージョン2.4における設定を記載します。

各パラメータの設定箇所を図にしています。

上記のパラメータはチューニング必須と考えておりますが、それに加えて個人的にチューニングしたほうがいいと考えているパラメータをご紹介します。

ListenBacklogによるキューイングのイメージを記載します。

KeepAliveの設定として下記パラメータがあります。KeepAliveのタイムアウトが短すぎても長すぎてもサーバーのリソースを効率的に使えないので、適切な値にチューニングすることが必要となります。

おわりに

Apache の性能は、単純な CPU やメモリのスペックだけで決まるものではありません。MPM(Multi-Processing Module)の選択、MaxRequestWorkers などのパラメータ設定、KeepAlive の調整、そして実際のリソース使用状況の把握 が大きく影響します。

特に重要なのは、次の 3 点です。
・自身のシステム構成・アクセス特性に合った MPM を選択する
・メモリ使用量を意識しながら MaxRequestWorkers を適切に設定する
・感覚ではなく、メトリクスやログをもとにチューニングする

やみくもに数値を上げるのではなく、「なぜその設定にするのか」を理解した上で調整することが、安定した商用運用につながります。Apache は歴史の長い Web サーバーであり、現在でも多くのミッションクリティカルなシステムで採用されています。基礎を正しく理解すれば、トラブルシューティングや性能改善の精度は大きく向上します。ぜひ今回の内容を参考に、あなたの環境に最適な Apache チューニングを実践してみてください。

ほかにもTomcat等の性能関連のコンテンツを記載していますので、ぜひ目を通してもらえると嬉しいです。
【Tomcat】並列処理の仕組みと流量制限のためのチューニング方法
【Tomcat】コネクションプールのチューニングによる流量制限の方法をまとめてみた。

コメント