解释heroku日志,工人过早被杀?

时间:2013-07-14 22:11:10

标签: ruby-on-rails heroku

我正在尝试调试工作者的问题,我在日志文件中看到了这条消息:

2013-07-14T21:59:07.024756+00:00 app[web.1]: E, [2013-07-14T14:59:07.024559 #2] ERROR -- : worker=1 PID:261 timeout (30s > 29s), killing
2013-07-14T21:59:07.067325+00:00 app[web.1]: E, [2013-07-14T14:59:07.066999 #2] ERROR -- : reaped #<Process::Status: pid 261 SIGKILL (signal 9)> worker=1
2013-07-14T21:59:07.070701+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=POST path=/photos/687 host=dev.tacktile.org fwd="199.83.223.92" dyno=web.1 connect=8ms service=29345ms status=503 bytes=0
2013-07-14T21:59:07.898048+00:00 app[web.1]: I, [2013-07-14T14:59:07.897739 #269]  INFO -- : worker=1 ready

如果我正确地读到这个,我的工人被杀了因为它花了超过30秒。我认为只有超过30秒的网络响应才会被杀死。我把这个任务放到一个延迟的工作中并与工人一起处理,因为我知道它很慢。

我希望我误解了一些事情。

2 个答案:

答案 0 :(得分:4)

您的日志显示dyno=web.1 - 所以看起来网络dyno连接在30秒后终止,而不是像您指示的工作人员dyno。您是否阅读了note attached to the definition of the h13 error表明:

  

可能发生这种情况的一个例子是Unicorn Web服务器   配置超过30秒的超时,并没有请求   在超时发生之前由工作人员处理。在这种情况下,   Unicorn会在写入任何数据之前关闭连接,从而导致   H13。

也许这有关系?

PS。编辑我的答案我看到“工人”你的意思是“独角兽工人”我猜?看起来你的独角兽工人因某种原因而死亡(这也许就是你得到H13的原因)。 Heroku不会明确杀死像AFAIK那样的子进程。

答案 1 :(得分:1)

我不是Ruby on Rails专家,但看起来你所谓的“工人”实际上是一个网络流程(正如dyno名称,web.1所示)。我猜你使用了Unicorn,它产生了几个进程,每个进程一次处理一个Web请求。我想,每个这样的过程被称为“工人”,所以这真的是术语问题。

至于为什么会发生这种情况:您的网络路径实际上是等待让您的真实工作人员完成请求,因此它也需要> 30秒?