20.11.2013 18:21, Grigory Batalov wrote:
Всем привет!

Моё FastCGI-приложение недавно начало странно зависать.
Выражается это в отказе принимать соединения некоторыми
из запущенных (идентичных) процессов, а потом и остальных.
При этом они реагируют на SIGHUP, сбрасывая в журнал статистику.

Как бы мне научиться его отлаживать и найти проблемное место?

В скрипте используется цикл

while ($loop) {

     my $q = CGI::Fast->new;
...
}
Примитивное журналирование показывает, что дальше этого места
в цикле не идёт. (Но и процесс не завершается, как если бы
$loop стал 0 .)

Несколько процессов запускаются с помощью
spawn-fcgi -p <port> /path/to/script
и разными портами.

В качестве фронтенда - nginx, настройка:

   upstream mine {
        server localhost:8082;
        server localhost:8083;
        server localhost:8084;
   }
   location /mine/ {
     fastcgi_pass  mine;
     fastcgi_index index.cgi;

     fastcgi_param SCRIPT_FILENAME mine.pl;
     fastcgi_param QUERY_STRING    $query_string;
     fastcgi_param REQUEST_METHOD  $request_method;
     fastcgi_param CONTENT_TYPE    $content_type;
     fastcgi_param CONTENT_LENGTH  $content_length;
     fastcgi_param REMOTE_ADDR     $remote_addr;
   }

В логах вижу
2013/11/20 12:24:02 [error] 12753#0: *22971445 recv() failed (104: Connection reset by peer) while reading 
response header from upstream, client: x.x.x.x, server: localhost, request: "POST /mine/ HTTP/1.1", 
upstream: "fastcgi://127.0.0.1:8082", host: "mine:8080"

После чего, не найдя ничего лучше, перезапускаю скрипты.
Куда копать?


Можно посмотреть на стек во время зависания:

$SIG{HUP} = sub {
  print STDERR Carp::longmess;
};

Можно ещё посмотреть strace.

--
Alexander Lourier
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить