持続的接続を理解するために(その7)
なんとなく持続的接続が理解できたような気がする。一部想像で話を進めてきた感はあるが、そこは改めて調べないといけない。で、ここまでの一連の流れの中で、設定すべき箇所を列挙しておくことにする。
apacheの設定
http://httpd.apache.org/docs/2.2/ja/mod/prefork.htm
- MaxClients
最大同時リクエスト数を設定。でも当然apacheで使用できるメモリは決まっていて、個々の子プロセスで使用できるメモリ量は、子プロセス数が多いほど割り当てが少なくなる。だからちょうどよさそうなところを割り当てる必要あり。 preforkの場合は子プロセス数に相当するがworkerで設定したapacheでは、この値はスレッド数に相当することに注意。
値を増やす際はServerLimit値も増やすこと。 - ServerLimit
preforkの場合はMaxClientsと同じ値を設定する。 - StartServers
apache(親プロセス)起動時に起動させる子プロセスの数。preforkならデフォルト5。 - MinSpareServers
アイドル状態にある子プロセスの最小値。つまり常にいくつの子プロセスを待機させておくか。実際の待機数がここで設定した値よりも小さくなると、親プロセスが最大1秒に1個の割合で新しい子プロセスを生成する。 - MaxSpareServers
アイドル状態にある子プロセスの最大値。待機中の子プロセスがここで設定した値よりも多い場合は破棄される。例えば一時的にリクエストが増えた場合はそれに応じて子プロセスが起動されるが、リクエストがなくなると必然的に子プロセスが待機状態となる。子プロセスが残っているということはその分メモリを使用している(他にも使っていると思う)ことになるので、必要な分は残し、不要な部分は破棄する。 - MaxRequestsPerChild
子プロセスの処理回数の上限。デフォルトは1000。
子プロセスは基本的に処理状態と待機状態を繰り返す。ここで設定した値を最大処理数として何度でも処理を実行する。しかしお行儀の悪いPHPプログラムとかその他の原因でメモリリークを引き起こすことがある。子プロセスに割り当てられたメモリを一度に食いきってしまうようなことがあると、その子プロセスは落ちるから、当該アクセスに限りエラーとなるが、少しずつリークした場合、当然その子プロセスで使用できる メモリの量が減る。そうしてメモリリークがたまると、結局どこかで落ちてしまう。ここで値を設定しておくと、自動的に子プロセスが再起動されるわけで、メモリリークも解消される。
いちおうこのディレクティブはKeepAliveディレクティブにも関連するらしいが、それはまた後日調べることにする。
PHPの設定(以前にも書いたけどおさらい)
http://www.php.net/manual/ja/mysql.configuration.php
- mysql.allow_persistent
持続的接続を可能にするか否か 。デフォルト1(接続可能)。 - mysql.max_persistent
プロセスごとの持続的MySQL接続の最大数。デフォルト-1(無制限)。 - mysql.max_links
プロセスごとの接続最大数。デフォルト-1(無制限)。 - mysql.connect_timeout
タイムアウト時間。デフォルト60(単位は秒)。接続しようと試みて、ここで指定した時間を過ぎても応答が帰ってこなかったらエラー。最初に接続を確立する際(connect)や、SQLを投げた際に結果が返ってくるまでにかかる時間で最大どのくらい待ってやるか、ということ。
あー、よく調べた。一つ賢くなった。