Heroku上Rails应用程序中的随机超时异常

时间:2013-03-25 16:21:48

标签: ruby-on-rails heroku timeout

我在Heroku上托管了一个Rails 3.2应用程序,每天在Rails应用程序中获得2-3次超时。这些是 H12请求超时,而是在Rails堆栈中某处发生的超时。因此,它们实际上会在网站上生成异常并显示在我的Airbrake日志中。

超时发生似乎是完全随机的;有时它在Formtastic之类的宝石中,或在HAML视图中,或在ActiveRecord代码中。您可以在此处查看一些回溯的示例:https://gist.github.com/dpmccabe/5238273

这个网站没有太多的流量并且在两个动态游戏中运行良好(尽管由于Adept Scale附加组件它们会自动扩展)。 HTTP_X_HEROKU_QUEUE_WAIT_TIME标头通常是低或零,所以我不认为这是一个路由问题。我甚至尝试从Thin切换到Unicorn没有效果(我的unicorn.rb显示在上面的要点中)。

这些超时异常似乎在整个应用程序中随机发生的事实并没有让我继续下去。我确实有New Relic,但我不确定如何调试这个。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我在heroku上托管的应用程序遇到了同样的问题。

我检查了日志,发现很少有请求需要超过30秒来处理,这导致了heroku的超时错误。 在我的情况下,问题是打印到日志,我有一个登台服务器,其中有大量输入和输出数据打印到服务器日志,打印时间超过30秒,heroku将认为请求仍在处理中响应是从远程api收到的,因为它还没有完成将数据打印到日志中。

因此,我删除了所有打印输入(输入由代码构造的xml数据)和输出(从api接收的xml数据)数据到日志的print语句。

  1. 因此,我建议您检查日志,看看请求是否需要超过30秒才能处理
  2. 检查是否打印数据(用于调试目的),需要时间在日志上打印。
  3. 同样,这可能不是你问题的答案,但这就是我解决了我的问题。 希望它有所帮助!

答案 1 :(得分:0)

根据Heroku Dev Center,如果完成请求的时间超过30秒,路由器将终止请求。 您可以使用rack-timeout gem来查找瓶颈。只需将你的超时时间少于30秒

Rack::Timeout.timeout = 15 # seconds

如果您有多个并行请求,请考虑使用Unicorn

答案 2 :(得分:0)

我也遇到过同样的问题。虽然我还没有解决它,但我想我会想到我到目前为止所看到的内容。我正在使用rack-timeout gem(基于你的回溯,看起来你也是如此)并且超时设置为15秒。查看新遗物,我对任何请求的平均应用服务器响应时间都远低于200毫秒。然而,和你一样,我每天得到2-3个错误,如下所示:

undefined method `result' for #<Timeout::Error: execution expired>

错误发生在各种各样的行动上,没有任何行动似乎特别容易产生行动。错误甚至发生在简单的CRUD DELETE操作上。我正在Heroku的Cedar堆栈上运行rails 3.2应用程序。我运行了两个网络动态,每个都有3个独角兽工作者。它们各自始终低于512mb的限制。

到目前为止,我发现的唯一线索就是我经常在日志中看到类似下面的内容:

[AMBER] LOG: process 21289 acquired ShareLock on transaction 105259 after 32366.132 ms

你看到类似的东西吗?锁定记录的DB操作可能导致超时,我不太确定。