0

Cherokee 1.2.101 の FastCGI で Archlinux / php-fpm 5.3.9 を実行している一部のサーバーで断続的な問題が発生しています。次のようなロジックを使用して静的キャッシュ ファイルを構築および提供するキャッシュ プラグインを使用しています。

$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

いくつかのプロセスは、その呼び出しでハングしている php-fpm の遅いログに記録されexit()ます。その時点で、負荷が急増し、100% の CPU 使用率が (ほぼ) 完全に Web サーバーに行き、PHP ページが 500 - 内部サーバー エラーを返し始めます。サーバーが自然に回復する場合もあれば、php-fpm と cherokee を再起動する必要がある場合もあります。

  • PHP-FPM の FastCGI 設定を実行するように構成しました。

  • これは VPS ですが、キャッシュ ファイルが既にロードされているはずなので、ファイルシステムでの IO 待機を暫定的に除外します。テストする行為でそれをキャッチできませんでしたvmstat

  • 500に設定しましたが、呼び出しがプロセスの循環を妨げているのではpm.max_requestsないかと思います。exit()

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

トラブルシューティングに関するヒントをいただければ幸いです。以下に、危険信号を発した 3 つの点を示します。

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

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

fastCGI の exit() 関数を呼び出すとエラーが発生しますか?

4

2 に答える 2

1

これは、出力をサーバーに渡すことに関連している可能性があります (I/O も追跡します)。Web サーバーが静的キャッシュ ファイルを提供するようにすることで、FPM を邪魔にならないようにすることができます。それとは別に、代わりにこの PHP チャンクを使用して、メモリ/I/O を少し減らすことをお勧めします。

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

を参照してくださいreadfile

使用したくない場合exit(個人的に PHP で FastCGI を使用する際に問題に遭遇したことはありません)、exit を使用する必要がないようにコードをクリーンアップするreturn必要があります。 exit を使用して問題を解決します。

于 2012-02-15T17:32:41.507 に答える
0

http://www.php.net/manual/en/function.exit.phpのコメントで引用されている Pythonic Exception ラッピング メソッドを使用することになりました。

メイン index.php で

class SystemExit extends Exception {}

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

Question の Cache Logic でexit( $cache_file_contents );

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

これにより、その上でのハングを示す php-fpm のスロー ログが緩和されましたexit()。根本的な問題が解決されたかどうかは完全にはわかりませんが、ログ ファイルはクリーンアップされています。

于 2012-02-21T20:35:00.737 に答える