Радужного работника убивают после тайм-аута, хотя он ответил
У меня есть приложение Sinatra, работающее на Rainbows. Я регистрирую следующее:
before do
logger.info("#{Process.pid} #{Time.now} #{request.ip} #{request.path_info} # {params.to_s}")
end
а также
after do
logger.info("#{Process.pid} #{Time.now} #{request.ip} #{request.path_info} #{params.to_s} => #{response.headers['X-API-Status']} (#{response.successful?})")
end
и в моих журналах я могу прочитать:
25988 2012-11-13 11:57:52 +0100 192.168.90.1 /req {"u"=>"810000027"}
25988 2012-11-13 11:57:59 +0100 192.168.90.1 /req {"u"=>"810000027"} => 200 (true)
192.168.90.1 - - [13/Nov/2012 11:57:59] "POST /req HTTP/1.1" **200** 14 7.5862
25988 2012-11-13 11:57:59 +0100 192.168.90.1 /req {"u"=>"810000027"}
25988 2012-11-13 11:57:59 +0100 192.168.90.1 /req {"u"=>"810000027"} => 200 (true)
192.168.90.1 - - [13/Nov/2012 11:57:59] "POST /req HTTP/1.1" 200 14 0.0223
E, [2012-11-13T11:58:04.099913 #25875] ERROR -- : worker=2 PID:**25988** timeout (12s > 11s), killing
E, [2012-11-13T11:58:04.106428 #25875] ERROR -- : reaped #<Process::Status: pid 25988 SIGKILL (signal 9)> worker=2
Моего работника (pid 25988) убивают так, как будто он не ответил на первый запрос... Но, очевидно, так и есть! Он даже обработал другой запрос (и я использую базовую модель параллелизма -> нет параллелизма)
Моя конфигурация Rainbows:
Rainbows! do
timeout(10)
end
listen(3000)
pid('/tmp/rainbows.pid')
stderr_path('/var/log/rainbows.log')
stdout_path('/var/log/rainbows.log')
working_directory('/opt/app')
worker_processes(4)
Ты хоть представляешь, что происходит? Или как я мог расследовать дальше? Спасибо!
1 ответ
Решение
На самом деле проблема заключалась в том, что клиент слишком долго "поддерживал работу" (flash). Видимо нет способа правильно закрыть TCP-соединение в AS3...
Я исправил свою проблему с:
Rainbows! do
keepalive_timeout(0)
end
что кажется подходящим для меня в любом случае.