個人的Apacheチューニングのメモ。
間違いがあったら教えて下さい!
prefork
前提
Apacheでは、リクエストはApacheの子サーバプロセスが処理する。
子サーバプロセスは動的にforkで生成されたり、殺されたりする。
が、forkはとても重い処理なので、forkが発生しないように設定するのがよい。
チューニング方針
負荷が高かろうが低かろうが常に一定数のプロセスが動いている状態にする。
preforkの動作
MaxClientsは絶対値。
子プロセス数はこの値を超えない。
(以下正確ではないですが簡単に)
Apacheは負荷が高くなってきたら
- 子プロセスを生成していく
- アイドル状態の子プロセスはMinSpareServers以上になるよう維持
- MaxClients以上の子プロセスは生成しない
- MinSpareServersよりMaxClientsが強い
負荷が低くなってきたら
- プロセスがアイドル状態になっていく
- アイドル状態の子プロセスがMaxSpareServers以下になるよう殺す
負荷が低い状態が続くと
- 子プロセスをMinSpareServersになるまで殺す
結論
MaxClients = MinSpareServers = MaxSpareServers = N
にすると、
- 低負荷状態ではMinSpareServers=N個のアイドルプロセスが確保される
- 高負荷状態では最大MaxClients=N個のプロセスしか作成されない
- 応答しているプロセスが0でもMaxSpareServers=N個のアイドル状態は許されている
つまり、forkが発生しません。
Nですが、
(サーバのメモリ)/(1個の子プロセスが使用する最大のメモリ量)
が上限値となります。
子プロセスが使用するメモリ量はモニタリングして把握しましょう。
以下、Nを500とした時の設定サンプルです。
StartServers 500
MaxClients 500
MinSpareServers 500
MaxSpareServers 500
ServerLimit 500
MaxRequestsPerChild 0
性能パラメータ
StartServers
起動時に生成される子サーバプロセスの数。デフォルトは5。
子サーバプロセス数は負荷に応じて動的に変化するのであまり意味はない。
常に動かしときたい数に設定しとくのがベター。
http://httpd.apache.org/docs/2.2/ja/mod/mpm_common.html#startservers
設定サンプル
StartServers 5
MinSpareServers
アイドル状態にいる子サーバプロセスの最小(希望)個数。デフォルトは5。
つまり、常にこの数のプロセスはアイドルでいてくださいね、という値。
アイドル状態の子サーバプロセスが足りなければ、最高で1プロセス/秒のペースで新規に子サーバプロセスを生成する。
この値を大きくするのは悪い発想らしい。
http://httpd.apache.org/docs/2.2/ja/mod/prefork.html#minspareservers
設定サンプル
MinSpareServers 5
MaxSpareServers
アイドル状態にいる子サーバプロセスの最大(希望)個数。デフォルトは10。
つまり、アイドル状態の子サーバプロセスの数がこの値をこえた時は小サーバプロセスを殺してくださいね、という値。
この値を大きくするのは悪い発想らしい。
設定サンプル
MaxSpareServers 19
MaxClients
応答できる同時リクエスト数。デフォルトは256。
つまり、起動される子サーバプロセスの最大数。
http://httpd.apache.org/docs/2.2/ja/mod/mpm_common.html#maxclients
設定サンプル
MaxClients 256
ServerLimit
MaxClients
に指定可能な値の上限。
つまりMaxClients
より多い値ならなんでもよい。
が、あんまり大きすぎると余分な未使用共有メモリが割り当てられたり、不安定になる。
MaxClients
がデフォルト(256)より大きい場合のみ、適切な値を設定する。
http://httpd.apache.org/docs/2.2/ja/mod/mpm_common.html#serverlimit
設定サンプル
ServerLimit 256
MaxRequestsPerChild
個々の子サーバプロセスが扱うことのできるリクエストの総数。デフォルトは10000。
つまり、子サーバプロセスが起動してからこの数だけリクエストを捌くと死ぬ。
0に設定すると無制限。
メモリリークなど起こった場合リークし続けるが、0にしておけばforkされる回数は大幅に減る。
http://httpd.apache.org/docs/2.0/ja/mod/mpm_common.html#maxrequestsperchild
設定サンプル
MaxRequestsPerChild 10000