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