Apacheからlighttpdに乗り換えたらCPU使用率が…

Apache+PHPからlighttpd+fastcgi+php-cgiに乗り換えてみた。別に問題があったわけではないが、気分的な問題。

しかしCentOS5でrpmforgeから

# yum install lighttpd lighttpd-fastcgi

で、普通に設定すると以下のようになる(デフォルトの設定ファイルのコメントを外すとこうなる)。

fastcgi.server  = ( ".php" =>
                        ( "localhost" =>
                          (
                            "socket" => "/var/run/lighttpd/php-fastcgi.socket",
                            "bin-path" => "/usr/bin/php-cgi"
                          )
                        )
                      )

これで動くことは動くが、CPU使用率が尋常でなくなってしまった。userとsysが半々で、合計するとほぼ100%。毎秒約60プロセスが生成され、そして終了していた。試しにいくつかのphp-cgiプロセスにstraceでattachしてみると、あるプロセスはaccept()待ちという健全な状態だが、他のいくつかのプロセスはwait()とclone()を大量に繰り返していた。php-cgiが増殖しすぎて消され、消されたから増殖して…という動作を繰り返しているかのような挙動。

以下のmuninグラフのApacheとlighttpdの間にあるuserとsysが肥大しているのが、問題の時間帯。赤いniceプロセスはWCG(World Community Grid)のBOINCクライアントによるものです。

localhost-cpu-week

図1:lighttpd導入当初のCPU使用率はuser+sysで満たされた

いろいろ試行錯誤したが、以下のように、いくつかの値を調節すると直った。これって、よくあること、なんでしょうか…

fastcgi.server = ( ".php" =>
                       ( "localhost" =>
                         (
                           "socket" => "/tmp/php-fastcgi.socket",
                           "bin-path" => "/usr/bin/php-cgi",
                           "idle-timeout" => 20,
                           "min-procs" => 1,
                           "max-procs" => 1,
                           "bin-environment" => (
                             "PHP_FCGI_CHILDREN" => "16",
                             "PHP_FCGI_MAX_REQUESTS" => "10000"
                           )
                         )
                       )
                     )

効いたのはPHP_FCGI_MAX_REQUESTSですかね? よくわかりません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です