彩虹工人在超时后被杀死,即使它回复了

Posted

技术标签:

【中文标题】彩虹工人在超时后被杀死,即使它回复了【英文标题】:Rainbows worker is being killed after timeout even though it replied 【发布时间】:2012-11-13 13:36:01 【问题描述】:

我有一个在 Rainbows 上运行的 Sinatra 应用程序。 我记录以下内容:

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】:

实际上问题在于客户端(闪存)“保持活动”的请求时间过长。显然没有办法properly close the tcp connection in AS3...

我解决了我的问题:

Rainbows! do
  keepalive_timeout(0)
end

这对我来说似乎很合适。

【讨论】:

以上是关于彩虹工人在超时后被杀死,即使它回复了的主要内容,如果未能解决你的问题,请参考以下文章

Smack4.1.7 在回复超时内没有收到回复

Android应用程序及其服务在打开某些应用程序后被杀死

众包中关于DS模型及其扩展设定总结

Ipython/Jupyter:等待 kernel_info 回复超时

Spring-AMQP 和直接回复

如何找出为啥 uWSGI 杀死工人?