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と関連ディレクティブ

MaxClientsMaxRequestWorkers)が示す上限は、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>

このサーバーではMaxClients150に設定されていることが分かります。

6. MaxClientsの適切な値を計算する方法

現在の設定値がサーバーの性能に見合っているかを確認しましょう。計算式は以下の通りです。

MaxClientsの最大値 = (サーバーの総メモリ – OS等が使用するメモリ) / Apacheプロセス1つあたりの平均メモリ使用量

1. Apacheプロセス1つあたりのメモリ使用量を調べる

以下のコマンドで、Apacheの子プロセス(apache2httpd)が使用しているメモリ量を確認します。注目するのは物理メモリ使用量を表す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. 設定ファイルを編集する

vinanoなどのエディタで、先ほど確認した設定ファイルを開きます。

# (例) 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