Webサーバーのパフォーマンスは、Webサイトやアプリケーションの応答速度に直結する重要な要素です。中でもApacheのMaxClients
(現MaxRequestWorkers
)設定は、サーバーの能力を最大限に引き出すための鍵となります。
この記事では、MaxClients
の役割から、サーバーのスペックに合わせた適切な値の計算方法、そして実際の設定変更手順までを分かりやすく解説します。
1. MaxClientsとは?
MaxClients
は、Apacheが同時に処理できるリクエストの最大数を定義する設定です。Apache 2.4からはMaxRequestWorkers
という名称に変更されましたが、今でもMaxClients
という呼び方が広く使われているため、この記事ではMaxClients
で統一して解説します。
クライアント(Webブラウザなど)からリクエストを受け取ると、Apacheは子プロセス(またはスレッド)を割り当てて処理します。MaxClients
は、この同時に稼働できる子プロセス(またはスレッド)の総数の上限を定めます。
- 設定値が小さすぎる場合: サーバーの処理能力に余力があるにもかかわらず、リクエストを取りこぼしてしまい、機会損失につながります。
- 設定値が大きすぎる場合: サーバーの搭載メモリを使い果たしてしまい、パフォーマンスの低下やサーバーダウンを引き起こす危険があります。
そのため、サーバーのスペック、特にメモリ容量を考慮して、この値を適切にチューニングすることが不可欠です。
2. 理解を深めるための基礎知識:プロセスとスレッド
MaxClients
を深く理解するために、まずは「プロセス」と「スレッド」という2つの基本的な用語を押さえておきましょう。
項目 | プロセス | スレッド |
---|---|---|
概要 | 実行中のプログラムそのもの | プロセス内での個別の処理担当 |
メモリ | 独立したメモリ空間を持つ | 親プロセスのメモリ空間を共有する |
リソース | 独自のコードやデータを持つ | スタックなど一部のリソースのみ個別に持つ |
3. Apacheの心臓部:MPM (Multi-Processing Module)
Apacheは、リクエストをどのように処理するか(工場の稼働方式)をMPM (Multi-Processing Module) というモジュールで切り替えることができます。MPMには主に3つの種類があり、それぞれにMaxClients
の挙動が異なります。
どのMPMで動作しているかは、apachectl -V
コマンドで確認できます。
MPMの種類と特徴
MPM | 特徴 | メリット | デメリット |
---|---|---|---|
prefork | 1リクエストを1プロセスで処理するシングルスレッド方式。 | 構造がシンプルで安定性が高い。スレッドセーフでない古いモジュールも利用可能。 | メモリ消費量が大きい。大量の同時接続には向かない。 |
worker | 複数プロセスを起動し、各プロセスが複数スレッドを持つ方式。 | メモリ効率が良く、preforkより多くのリクエストを処理できる。 | Keep-Alive接続でスレッドが専有されてしまう問題があった。 |
event | workerを改良した現在の標準モデル (Apache 2.4以降のデフォルト)。 | メモリ効率が良い。workerのKeep-Alive問題を解決し、さらに高効率。 | 利用するモジュールはスレッドセーフである必要がある。 |
4. MaxClientsと関連ディレクティブ
MaxClients
(MaxRequestWorkers
)が示す上限は、MPMによって意味合いが変わります。
- prefork: 起動できる子プロセスの最大数
- worker/event: 全ての子プロセスで起動できるスレッドの総数
また、MaxClients
の挙動には、以下のディレクティブが密接に関連しています。
ディレクティブ | 説明 |
---|---|
MaxRequestWorkers (MaxClients ) |
同時リクエスト処理の最大数(プロセス数またはスレッド総数)。 |
ServerLimit |
MaxRequestWorkers に設定できる物理的な上限値。MaxRequestWorkers より大きいか同じ値に設定する。 |
ThreadsPerChild |
(worker/event) 1つの子プロセスが生成するスレッド数。 |
StartServers |
Apache起動時に生成される子プロセスの初期数。 |
MinSpareServers / MaxSpareServers |
(prefork) アイドル状態の子プロセスの最小/最大数。 |
MinSpareThreads / MaxSpareThreads |
(worker/event) アイドル状態のスレッド総数の最小/最大数。 |
MaxConnectionsPerChild |
子プロセスが終了するまでに処理するリクエスト数の上限。0は無制限。メモリリーク対策に有効。 |
ListenBacklog |
MaxRequestWorkers の上限に達した際に、リクエストを保持するキューの長さ。 |
5. 現在の設定値を確認する
まず、お使いのApacheサーバーの現状を把握しましょう。
1. 現在のMPMを確認する
以下のコマンドで、ApacheがどのMPMで動作しているかを確認します。
# Debian/Ubuntu系 apachectl -V | grep "Server MPM" # RedHat/CentOS系 httpd -V | grep "Server MPM"
実行結果の例:
Server MPM: prefork
この場合、prefork
MPMで動作していることが分かります。
2. 設定ファイルで現在の値を確認する
次に、設定ファイルからMaxClients
またはMaxRequestWorkers
の値を探します。設定ファイルの場所はOSによって異なります。
- Debian/Ubuntu系:
/etc/apache2/mods-available/mpm_[MPM名].conf
- RedHat/CentOS系:
/etc/httpd/conf.modules.d/00-mpm.conf
grep
コマンドで設定値を探してみましょう。([MPM名]
の部分は先ほど確認した名前に置き換えてください)
# prefork の場合 (RedHatでの例) grep -i "MaxRequestWorkers" /etc/httpd/conf.modules.d/00-mpm.conf
実行結果の例 (prefork
の場合):
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 # ← この値! MaxRequestsPerChild 0 </IfModule>
このサーバーではMaxClients
が150
に設定されていることが分かります。
6. MaxClientsの適切な値を計算する方法
現在の設定値がサーバーの性能に見合っているかを確認しましょう。計算式は以下の通りです。
MaxClients
の最大値 = (サーバーの総メモリ – OS等が使用するメモリ) / Apacheプロセス1つあたりの平均メモリ使用量
1. Apacheプロセス1つあたりのメモリ使用量を調べる
以下のコマンドで、Apacheの子プロセス(apache2
やhttpd
)が使用しているメモリ量を確認します。注目するのは物理メモリ使用量を表すRSS
(Resident Set Size)列です。
# プロセスをメモリ使用量の大きい順に表示 ps aux --sort=-rss | grep 'apache2\|httpd' | head -n 10
実行結果の例:
[ec2-user@web-01 ~]$ ps aux | grep 'httpd' | sort -k6 -rn | head -n 10 apache 3423827 0.0 0.3 726580 57080 ? Sl 10:11 0:00 /usr/sbin/httpd -DFOREGROUND root 1587836 0.1 0.3 656604 51740 ? Ss 6月03 105:02 /usr/sbin/httpd -DFOREGROUND apache 3416258 0.0 0.3 719816 50532 ? Sl 09:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 3422786 0.0 0.3 719504 49316 ? Sl 10:09 0:00 /usr/sbin/httpd -DFOREGROUND apache 3419215 0.0 0.3 719204 48804 ? Sl 10:00 0:00 /usr/sbin/httpd -DFOREGROUND apache 3412899 0.0 0.3 715648 48528 ? Sl 09:45 0:00 /usr/sbin/httpd -DFOREGROUND apache 3407304 0.0 0.3 717572 47904 ? Sl 09:30 0:00 /usr/sbin/httpd -DFOREGROUND apache 3412665 0.0 0.2 717480 47332 ? Sl 09:44 0:00 /usr/sbin/httpd -DFOREGROUND apache 3413989 0.0 0.2 715396 47228 ? Sl 09:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 3418248 0.0 0.2 715812 46812 ? Sl 09:58 0:00 /usr/sbin/httpd -DFOREGROUND
表示されたプロセスのRSS
列(6列目、単位はKB)から、平均的な値を把握します。この例では、おおよそ50,000 KB (約 50 MB) を使用していることが分かります。
2. サーバーの空きメモリを確認する
次に、Apacheが利用できるメモリ量を確認します。free
コマンドが便利です。-m
オプションでMB単位で表示します。
free -m
実行結果の例:
total used free shared buff/cache available Mem: 19980 4500 1080 5 14390 13500 Swap: 0 0 0
この例では、available
(利用可能)なメモリが約 13500
MB あることが分かります。OSやDBサーバーなどもメモリを消費するため、total
ではなくavailable
の値を基準に考えるのが安全です。
3. MaxClients
の値を計算する
手順1と2で得た情報を使って計算します。
- Apacheが使えるメモリ:
13500
MB - Apacheプロセス1つあたりのメモリ使用量:
50
MB
13500MB \ 50MB = 270
計算上の上限は 270
となります。ただし、急な負荷上昇などに備えて少し余裕(マージン)を持たせるのが一般的です。この場合は250
程度に設定するのが安全な選択と言えるでしょう。
7. MaxClientsの値を変更する
計算した適切な値に基づき、設定を変更します。
1. 設定ファイルを編集する
vi
やnano
などのエディタで、先ほど確認した設定ファイルを開きます。
# (例) RedHatでpreforkの場合 sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
2. 値を変更する
ファイル内のMaxClients
またはMaxRequestWorkers
の値を、計算した値に書き換えます。
注意点:
- preforkの場合:
MaxClients
の値を変更します。 - worker/eventの場合:
MaxRequestWorkers
の値を変更します。このとき、ServerLimit
ディレクティブがあれば、MaxRequestWorkers
と同じかそれ以上の値に設定する必要があります。
設定例 (event
MPM):
<IfModule mpm_event_module> StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxRequestWorkers 250 # ← この値を変更 MaxConnectionsPerChild 0 </IfModule>
3. 構文チェックとApacheの再起動
設定を保存したら、必ず構文チェックを行います。これは設定ミスによるサービス停止を防ぐための重要な手順です。
sudo apachectl configtest
Syntax OK
と表示されれば問題ありません。最後にApacheを再起動して設定を反映させます。
# Debian/Ubuntu系 sudo systemctl restart apache2 # RedHat/CentOS系 sudo systemctl restart httpd
これで設定変更は完了です。
まとめ
MaxClients
(MaxRequestWorkers
) は、Apacheのパフォーマンスを左右する非常に重要なディレクティブです。サーバーのメモリという限りあるリソースを最大限に活用し、安定したサービスを提供するためには、サーバーの実態に合わせてこの値を適切に設定することが不可欠です。
サーバーの負荷やメモリ使用状況を確認し、設定値を見直してみてください。
参考ドキュメント
Apache Module httpd core (MaxRequestWorkers)
https://httpd.apache.org/docs/2.4/mod/core.html#maxrequestworkers
Apache MPM prefork
https://httpd.apache.org/docs/2.4/mod/prefork.html
Apache MPM worker
https://httpd.apache.org/docs/2.4/mod/worker.html
Apache MPM event
https://httpd.apache.org/docs/2.4/mod/event.html
Apache mpm 関連のディレクトリ
https://httpd.apache.org/docs/2.4/mod/mpm_common.html#startservers