2

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

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 秒的网络响应才会被杀死。我将这项任务置于一项延迟的工作中并与一名工人一起处理它,因为我知道它很慢。

我希望我误解了什么。

4

2 回答 2

4

您的日志显示dyno=web.1- 所以看起来网络测功机连接在 30 秒后终止,而不是像您指示的工作测功机。您是否阅读了附在 h13 错误定义中的说明:

可能发生这种情况的一个示例是,当 Unicorn Web 服务器配置的超时时间短于 30 秒,并且在超时发生之前工作人员尚未处理请求。在这种情况下,Unicorn 在写入任何数据之前关闭连接,从而导致 H13。

也许这有关系?

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

于 2013-07-15T18:19:33.933 回答
1

我不是 Ruby on Rails 专家,但您所说的“worker”似乎实际上是一个 Web 进程(从 dyno 名称 web.1 可以看出)。我猜您使用的是 Unicorn,它会产生多个进程,每个进程一次处理一个 Web 请求。我猜,每个这样的过程都被称为“工人”,所以这实际上是一个术语问题。

至于它发生的原因:可能是您的网络路径实际上等待您的真正工作人员完成请求,因此它也需要> 30秒?

于 2013-07-15T18:19:25.533 回答