Apache2.4 preforkパラメータの設定方法

2022年12月13日

Apache Prefork MPM Configurationの翻訳。


Preforkは、Apacheのデフォルトのマルチプロセッシングモジュールである。システム管理者として働き始めると、一般的にはトラフィックの少ないサーバを扱うだろう。Apacheが複数のプロセスを同時に処理する方法について知る必要はないのだ。私でさえ、それについてすべてを知っていたわけではない。しかし、高負荷のサーバーを扱うようになり、Apacheを最適化する必要が出てくる。その時には、Apacheのマルチプロセッシングモジュールとその動作について知ることが重要になる。

Apache Preforkのデフォルト設定

以下は、Apacheのバージョンに応じたPrefork Multi-Processing モジュールのデフォルトの設定である。

Apache 2.4

StartServers 3
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 400
MaxConnectionsPerChild 0

Apache 2.2

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0

Prefork 設定ディレクティブ

  1. StartServers: このディレクティブは、Apache 起動時に作成する子サーバプロセスの数を定義する。プロセス数はサーバの負荷に応じて動的に増加するので、 通常はこの値を変更する必要は無い。

  2. MinSpareServers: これは Apache が実行するアイドルな子プロセスの最小数で、常に着信接続を待つ。アイドルプロセスの最小値がMinSpareServersの値より小さい場合、Apacheは最小のスペアサーバを維持するために子プロセスを開始する。

  3. MaxSpareServers: これはアイドル状態であることのできる最大プロセス数である。アイドル状態のプロセスがMaxSpareServersの値より多くなった場合、親プロセスは余分なアイドル状態の子プロセスを強制終了させる。

  4. MaxClients(2.2) と MaxRequestWorkers(2.4): これは最も重要な prefork ディレクティブだ。これは、Apache サーバが処理できるリクエストの最大数を設定する。最大接続数や最大リクエスト数がこの値を超えると、すべての余分なリクエストはキューで待つ必要がある。

この値は、ハードウェアが許す限り高くする。この値の設定方法を以下に詳述する。

  • a. システム上のRAMの総数を調べる。
  • b. Apacheサーバーに利用可能なRAMの容量を確認する。
  • c. Apache の一つのプロセスで使われる平均メモリを知る。

値 <= ( Apache で使用可能な総メモリ量 ) / ( 一つのプロセスで使用するメモリ量 )

  1. MaxRequestsPerChild(2.2) または MaxConnectionsPerChild(2.4): これは、子プロセスが一生の間に処理できるリクエストの最大数である。たとえば、この値を 100 に設定した場合。新しい子プロセスは 100 リクエストまで処理した後、親プロセスに殺される。その場で Apache は新しい子プロセスを開始する。

この値は高くしておくことを推奨する (少なくとも 0 より大きくすること)。このパラメータを 0 に設定すると、プロセスが期限切れにならないことを意味し、 メモリリークの問題が発生し、大量のメモリを消費する可能性がある。

StartServers、MinSpareServers、MinSpareServersディレクティブの値をいつ変更すべきか

トラフィックの少ないサーバでは、これらのディレクティブを変更する必要はない。1分間に数千のリクエストを処理するようなサーバであれば、これらの値を変更する必要が出てくる。しかし、まず最初にApacheの新しいプロセス生成の頻度について知っておく必要がある。

  • Apache 2.2 は 1 秒に 1 プロセスを生成できる。
  • Apache 2.4 では、1 秒間に最大 32 プロセスを生成できる。アイドル状態の最低予備プロセスがMinSpareServersの値より少ない場合、Apacheは1プロセスを開始して1秒待ち、それでも少ない場合はApacheは2プロセスを開始して1秒待ち、それでも少ない場合はApacheは4プロセスを開始して1秒待ち、同様にApacheは1秒間に32の予備子プロセスを起動でき、最低予備プロセスがMinSpareServersの値を上回るまで繰り返される。

例えば、サーバがApache 2.2で動作している場合、Apacheは1秒間に1つの予備プロセスしか起動することができない。つまり、もしあなたのサーバが1秒間に1回以上の接続を受けるのであれば、これらのパラメータをすべて調整し、常にアイドルプロセスを走らせ続ける必要がある。しかし、それはまた、プロセスが完了するまでにかかる時間にも依存する。

同様に、サーバがApache 2.4で動作している場合、Apache 2.4は1秒間に32のチリプロセスを起動することができるので、これらのパラメータを変更する必要はほとんどないかもしれない。

(記事の翻訳は以上)


まとめると以下になる。

prefork方式の場合、一つのプロセスが一つのリクエストを処理する。新たなリクエストがあった場合の動作としては以下になる。

  • 空きプロセス(アイドル)があれば、そのプロセスが処理する。
  • 無ければ、新たにプロセスを作ってそれに処理させるか、待機してもらう。

ということになる。

StartServersは、Apache起動時に作成するプロセス数を指定し、MinSpareServers/MaxSpareServersは、アイドルプロセス数の下限と上限を指定する。少なすぎる場合はプロセスが作成され、多すぎる場合は、プロセスが殺される。

MaxRequestWorkers(2.4)は、Apacheが同時にリクエストを処理できる最大数、つまり、プロセスの最大数ということになる。これ以上のリクエストが来た場合は待機させられる。つまり、(忙しいサーバでは)メモリ等が許す限り、この値を大きくすべしということ。

MaxConnectionsPerChild(2.4)は、一つのプロセスがいくつのリクエストを処理したら殺されるかなのだが、なぜこんなことをするかと言えば、リクエスト処理の過程でメモリリークが発生することがあるから。Apacheでのサービスは、そのプロセス上でApache以外のプログラムを呼び出して行うため、それらのプログラムの行儀が悪い場合には、リークが発生し、メモリを圧迫する可能性があるため。リークが発生しないとわかっているなら、0として無制限でもよい。