2012-02-15 35 views
0

私は、チェロキー1.2.101のFastCGIでArchlinux/php-fpm 5.3.9を実行しているサーバで断続的な問題が発生しています。私のようなロジックを使用して、静的キャッシュファイルを構築し、提供キャッシュプラグインを使用しています:CPUのスパイクを引き起こすPHP-FPM/FastCGI + exit()

$cache_file = md5($host . $uri) . '.cache'; 
if(file_exists($cache_file)) { 
    $cache_file_contents = file_get_contents($cache_file) 
    exit($cache_file_contents); 
} 
// else build/save the $cache_file 

いくつかのプロセスがそのexit()呼び出しでのphp-FPMハングのスローログになってしまいます。その時点で、負荷スパイクは、CPU使用率100%がウェブサーバに(ほぼ)行き、PHPページは500 - 内部サーバエラーを返すようになります。時にはサーバーが自分自身で回復し、他の人はphp-fpmとcherokeeを再起動する必要があります。

  • 私はPHP-FPM用のFastCGIの設定は、これは私が暫定的にキャッシュファイルが既にロードされなければならないとしてIOがファイルシステム上で待って排除しますVPSであっても

  • を行うように設定しています。私は500からpm.max_requestsセットを持っていますが、exit()呼び出しはプロセスの循環を妨害しているかどうか疑問vmstat

  • をテストするための行為でそれをキャッチすることができていません。

  • php-fpmログには、多くのWARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)が表示されます。これは、プール内の子プロセスの数を規定するphp-fpmの通常の部分のようです。

トラブルシューティングに関するヒントは、評価されます。これは、サーバーへの上に出力を渡すことに関係している可能性がある

http://www.php.net/manual/en/function.exit.php#96930

https://serverfault.com/questions/84962/php-via-fastcgi-terminated-by-calling-exit#85008

Errors when calling exit() function for fastCGI?

+0

トラブルシューティングのために、straceを使って特定のプロセスが何をしているのかを調べることができます: 'strace -p PID' – Marki555

答えて

0

私は、メインインデックスではhttp://www.php.net/manual/en/function.exit.php

でのコメントで引用Python的例外ラッピング方法を使用して終了。質問からPHPのキャッシュロジックで

class SystemExit extends Exception {} 

try{ 
    /* Resume loading web-app */ 
} 
catch (SystemExit $e) {} 

、これはそのexit()にハングを示しPHP-FPMスローログを緩和したexit($cache_file_contents);

while (@ob_end_flush()); 
flush(); 
echo $cache_file_contents; 
throw new SystemExit(); 

を交換します。根本的な問題は解決しているとは確信していませんが、ログファイルをクリーンアップしました。

1

(だけでなくI/O追跡:ここではいくつかの赤い旗を上げた私が見つけた3つの事があります)。静的キャッシュファイルをWebサーバーに提供することで、FPMを邪魔にならないようにすることができます。それとは別に、私はあなたがメモリ/ I/Oを少し軽減する代わりに、このPHPチャンクを使用することをお勧めしたい:

if (file_exists($cache_file)) 
{ 
    readfile($cache_file) 
    exit; 
} 

readfileを参照してください。

exit(私は個人的にPHPでFastCGIを使用する際に問題が発生したことはありません)を使用しない場合は、exitを使用する必要がないようにコードを整理する必要があります。 returnを実行するか、コードフローを見て、なぜexitを使用して問題を解決する必要があるのか​​を確認してください。

関連する問題