Apacheとは
Apache(正式名称:Apache HTTP Server)は、世界中で広く利用されているオープンソースのWebサーバーソフトウェアです。HTTP/HTTPSリクエストを受け付け、HTMLや画像などの静的コンテンツを返したり、TomcatなどのApplication Serverへリクエストを転送したりします。
本記事では、Apacheの性能を考えるうえで重要なMPM(Multi-Processing Module)の仕組みと、MaxRequestWorkers、ListenBacklog、KeepAliveなどの主要パラメータについて解説します。
Apacheの並行処理を決めるMPMとは
Apacheでは、MPM(Multi-Processing Module)によって、ProcessやThreadをどのように使って複数のConnectionやRequestを処理するかが決まります。Apache 2.4で代表的なMPMには、prefork、worker、eventがあります。
それぞれProcess / Threadの使い方やKeepAlive Connectionの扱い方が異なります。特に多数のKeepAlive Connectionを扱う環境では、Worker Threadを効率的に利用できるevent MPMが有力な選択肢となります。ただし、利用するModuleやApplication構成との互換性も確認したうえで選択してください。
| 比較項目 | prefork | worker | event |
|---|---|---|---|
| 処理方式 | 各Processが1つのRequestを処理 | Processごとに複数のThreadを使用し、各ThreadがRequestを処理 | Processごとに複数のThreadを使用し、各ThreadがRequestを処理 KeepAlive待機などをWorker Threadから切り離して管理 |
| メリット | ・Processが独立しているため安定性が高い ・Thread SafeでないModuleも利用しやすい | ・Threadを利用するためMemory使用量を抑えやすい ・Process切り替えが少なく、preforkより効率的 | ・Threadを利用するためMemory使用量を抑えやすい ・KeepAlive待機中にWorker Threadを占有しにくい ・多数のConnectionを効率的に扱いやすい |
| デメリット | ・同時処理数を増やすと多くのProcessが必要 ・Memory使用量が増えやすい ・Process切り替えのOverheadが大きくなりやすい | ・Thread SafeでないModuleとの互換性に注意が必要 ・KeepAlive待機中もWorker Threadを占有する | ・Thread SafeでないModuleとの互換性に注意が必要 |
| KeepAlive | Processを占有 | Worker Threadを占有 | KeepAlive待機をWorker Threadから切り離して管理 |
| 特徴 | 最も古いMPM方式 | Process+Threadによる並行処理 | workerをベースにKeepAliveなどのConnection管理を効率化 |
| 選択の目安 | Thread SafeでないModuleなど、preforkが必要な構成 | Thread方式を利用したい構成 | Apache 2.4で一般的な選択肢。多数のKeepAlive Connectionを効率的に扱いたい構成 |
prefork MPM
prefork MPMではThreadを使用せず、複数のChild ProcessによってRequestを処理します。基本的に1つのChild Processが1つのConnectionを処理します。Apacheは一定数のIdle Processをあらかじめ用意し、負荷に応じてChild Process数を調整します。
Process単位で処理を分離できる一方、ProcessごとにMemoryを使用するため、同時処理数を増やすほどMemory消費量も大きくなりやすい点に注意が必要です。

worker MPM
worker MPMでは、複数のChild Processを起動し、それぞれのProcess内に複数のWorker Threadを持ちます。RequestをThread単位で並行処理できるため、Processのみで処理するpreforkと比べてMemoryを効率的に利用しやすい構成です。
event MPM
event MPMもworkerと同様に、複数Process・複数ThreadでRequestを処理します。大きな特徴は、KeepAlive待機中のConnectionをWorker Threadから切り離して管理できることです。

workerとeventの違い|KeepAliveの扱い
workerとeventの違いを理解するうえで重要なのが、HTTP Keep-Alive中のConnectionの扱いです。
workerではKeepAlive待ちでもWorker Threadを占有する
worker MPMでは、Responseを返した後もKeepAliveによって次のRequestを待っている間は、Worker ThreadがそのConnectionに割り当てられた状態になります。そのためKeepAlive待ちのConnectionが大量に存在すると、実際にはRequestを処理していないThreadによってWorker資源が消費されることがあります。

eventではKeepAlive待ちをWorker Threadから切り離す
event MPMでは、Request処理が完了してKeepAliveの待機状態になると、そのConnectionをWorker Threadから切り離して管理できます。Connection自体は維持したまま、Worker Threadを別のRequest処理へ利用できるため、多数のKeepAlive Connectionが存在する環境でもWorker Threadを効率的に利用できます。

HTTP Keep-Aliveとは
ApacheのKeepAliveは、1つのTCP Connectionを複数のHTTP Requestで再利用する仕組みです。RequestごとにTCP Connectionを確立・切断する必要がなくなるため、Connection確立に伴うOverheadを削減できます。
ここでいうHTTP Keep-Aliveは、Connectionの生存確認を目的としてProbeを送信するTCP Keepaliveとは別の仕組みです。KeepAliveを長く維持すればConnectionを再利用しやすくなる一方、待機Connectionも長く保持されるため、アクセス特性やMPMを考慮してKeepAliveTimeoutなどを設定することが重要です。

MPMの詳細はApache HTTP Serverの公式ドキュメントも参照してください。
Apache HTTP Server Version 2.4 – Multi-Processing Modules (MPMs)
現在使用しているMPMを確認する
チューニングを始める前に、現在どのMPMが使用されているかを確認します。
apachectl -V出力されるServer MPMを確認することで、prefork / worker / eventのどれが利用されているか判断できます。

上記例における出力の意味は、以下の通りです。
– Server MPM: event → event MPMを使用
– threaded: yes → Threadを使って並行処理する
– forked: yes → 複数のChild Processを使用する
Apacheの同時処理数を決めるMaxRequestWorkers
Apacheの性能チューニングで特に重要なのがMaxRequestWorkersです。このパラメータは、Apacheが同時に処理へ割り当てられるWorker数の上限を決めます。
preforkではProcess、worker/eventではWorker Threadが主な処理単位となります。特にevent MPMではKeepAlive待機中のConnectionをWorker Threadから切り離して管理できるため、MaxRequestWorkersをApacheが保持できるTCP Connection総数と単純に同一視しないことが重要です。

worker/eventでは、ServerLimit、ThreadsPerChild、MaxRequestWorkersの関係も重要です。Process数とProcessあたりのThread数によって、Apache全体で利用できるWorker Thread数が決まります。

MaxRequestWorkersは大きくすれば速くなるのか
MaxRequestWorkersは、大きくすれば必ず性能が向上するわけではありません。値を増やすと同時に処理できるRequest数は増えますが、その分ProcessやThreadが使用するCPU・Memoryも増加します。
MaxRequestWorkersを増やす
↓
同時処理できるRequestが増える
↓
CPU / Memory使用量も増える
↓
上げすぎるとCPU飽和・Swap・OOMなどの原因になる
また、Apacheの後段にTomcatやApplication Server、Databaseが存在する構成では、Apacheだけ同時処理数を増やしても後段が処理しきれない可能性があります。システム全体の処理能力を考慮して値を決めることが重要です。
ListenBacklog|処理待ちConnectionをどこまで受け付けるか
ApacheがすぐにConnectionを受け付けられない場合、OS側のListen Queueで確立済みConnectionが待機します。ApacheのListenBacklogは、listen()に渡すBacklog値を設定するDirectiveです。実際のQueue上限はLinux Kernel側の設定などの影響も受けます。


ListenBacklogとMaxRequestWorkersは役割が異なります。ListenBacklogはApacheがacceptする前のConnection待ちに関係し、MaxRequestWorkersはApacheが同時に処理へ割り当てるWorker数に関係します。この2つを分けて理解することが重要です。
KeepAliveのチューニング
KeepAlive関連では、KeepAlive、KeepAliveTimeout、MaxKeepAliveRequestsなどを確認します。KeepAliveTimeoutを長くするとConnectionを再利用しやすくなる一方、待機Connectionを長時間保持します。反対に短すぎるとTCP Connectionを頻繁に確立し直すことになり、Overheadが増える可能性があります。

最適値はアクセス特性によって異なるため、一律の値を設定するのではなく、実際のConnection数、Request Rate、Response Time、CPU・Memory使用量などを確認しながら調整します。
Apacheチューニングでは何を監視するか
Apacheの性能改善では、設定値だけを見るのではなく、実際の稼働状況と合わせて判断することが重要です。mod_statusを利用できる環境では、BusyWorkers / IdleWorkersなどを確認し、Workerが上限付近まで使用されていないかを把握できます。
あわせてOS側のCPU使用率、Memory使用量、Swap、Load Average、TCP Connection数なども確認します。MaxRequestWorkersに到達しているからといって単純に値を増やすのではなく、CPUやMemory、後段のApplication ServerやDatabaseに余力があるかを確認してから調整してください。
おわりに
Apacheの性能は、単純なCPUやMemoryのスペックだけで決まるものではありません。MPMの選択、MaxRequestWorkersによる同時処理数、ListenBacklog、HTTP Keep-Alive、そして実際のリソース使用状況が相互に関係します。
まずは「ApacheがどのMPMで、どのようにRequestを並行処理しているのか」を理解することが重要です。そのうえでMaxRequestWorkersをむやみに増やすのではなく、CPU・Memory・Connection・後段システムの処理能力を確認しながら調整します。
特にevent MPMでは、KeepAlive待機ConnectionとWorker Threadを切り離して考えることがポイントです。MPM、同時処理数、Listen Queue、KeepAliveの関係を理解しておくと、Apacheの性能問題やConnection詰まりを調査するときにも役立ちます。
ほかにもTomcat等の性能関連コンテンツを掲載しています。Apacheの後段まで含めてWebシステム全体の同時処理を理解したい場合は、以下の記事も参考にしてください。
【Tomcat】並列処理の仕組みと流量制限のためのチューニング方法
【Tomcat】コネクションプールのチューニングによる流量制限の方法をまとめてみた。


コメント