Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
626
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@nownabe

Apacheのチューニングメモ

個人的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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
626
Help us understand the problem. What are the problem?