PHP-FPM / FastCGI + exit (), вызывающий скачки ЦП - PullRequest
0 голосов
/ 15 февраля 2012

У меня периодически возникали проблемы на некоторых серверах под управлением Archlinux / php-fpm 5.3.9 в FastCGI на Cherokee 1.2.101.Я использую плагин кеширования, который создает и обслуживает статические файлы кеша, используя логику:

$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% (почти) целиком переходит на веб-сервер , и страницы PHP начинают возвращать 500 - Внутренние ошибки сервера.Иногда сервер восстанавливается сам по себе, другим мне нужно перезапустить php-fpm и cherokee.

  • У меня есть настройки FastCGI для PHP-FPM, настроенные на

  • Несмотря на то, что это VPS, я бы предварительно исключил ожидание ввода-вывода в файловой системе, поскольку файл кэша уже должен быть загружен.Я не смог поймать его в действии для проверки с vmstat

  • У меня pm.max_requests установлено на 500, но мне интересно, мешает ли вызов 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

Ошибки при вызове функции exit () для fastCGI?

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Это может быть связано с передачей вывода на сервер (также отслеживание ввода / вывода). Вы можете обойтись без FPM, сделав свой веб-сервер обслуживающим файлы статического кэша. Кроме того, я бы посоветовал вам использовать этот кусок PHP вместо того, чтобы немного уменьшить память / ввод / вывод:

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

См. readfile.

Если вы не хотите использовать exit (лично я никогда не сталкивался с проблемой использования его с FastCGI в PHP), вы должны очистить свой код, чтобы не было необходимости использовать exit, например, вы могли бы return или посмотреть в потоке кода, почему вам нужно использовать выход и устранить проблему.

0 голосов
/ 22 февраля 2012

Я закончил тем, что использовал метод упаковки Pythonic Exception, процитированный в комментариях в http://www.php.net/manual/en/function.exit.php

В основном index.php

class SystemExit extends Exception {}

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

В логике кэша из вопроса , заменив exit( $cache_file_contents );

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

Это уменьшило медленные журналы php-fpm, которые показывают зависание на этом exit(). Я не совсем уверен, что он решил основную проблему, но он очистил файлы журналов.

...