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クライアントによるものです。
図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ですかね? よくわかりません。