Ruby on rails Heroku:在一个简单的Rails应用程序上正常停机15分钟

Ruby on rails Heroku:在一个简单的Rails应用程序上正常停机15分钟,ruby-on-rails,postgresql,heroku,timeout,Ruby On Rails,Postgresql,Heroku,Timeout,我是Rails新手,刚刚将我的第一个应用程序部署到Heroku(免费层)。我设置了New Relic的免费试用版,并将可用性监控设置为每1分钟ping my/register/URL一次。我正在运行Rails 3.2.13和Ruby 1.9.3 我的应用程序基本上没有用户,也没有请求(每分钟2个请求,大部分来自NewRelic)。我没有后台服务或外部依赖项。数据模型很简单,没有查询需要超过100毫秒 我每隔几个小时就要停电15分钟 因为Heroku只保存了1500行日志,所以我没有每个事件的数

我是Rails新手,刚刚将我的第一个应用程序部署到Heroku(免费层)。我设置了New Relic的免费试用版,并将可用性监控设置为每1分钟ping my/register/URL一次。我正在运行Rails 3.2.13和Ruby 1.9.3

我的应用程序基本上没有用户,也没有请求(每分钟2个请求,大部分来自NewRelic)。我没有后台服务或外部依赖项。数据模型很简单,没有查询需要超过100毫秒

我每隔几个小时就要停电15分钟

因为Heroku只保存了1500行日志,所以我没有每个事件的数据,但这里是第二个blip的日志(我的图表是-0400,Heroku是UTC)

完整日志:

摘要

  • 00:56:21到01:00:21:正常情况下,它每分钟发出一个请求
  • 01:01:55:收到的最后一个请求似乎没有得到满足
  • 01:02:21到01:17:21:54 H12(请求超时)错误
  • 01:17:25:PG::Error(SSL系统调用错误:检测到EOF)(旁白:我注意到Heroku的日志语句有问题,很奇怪。)
这是我的问题的原因,还是仅仅是一种症状?一些谷歌搜索显示了关于初级阶段Postgres超时的讨论,以及一些不使用生产阶段的警告:

更多堆栈溢出:

和关于自动重新连接的Rails票证:

这看起来是一个很好的线索,但似乎没有人解决这个问题。Heroku的Postgres上似乎有一些片状物,Rails答案如下:


T01:02:21.144033+00:00 heroku[路由器]:at=错误代码=H12 desc=“请求超时”方法=头路径=/注册主机=www.puckpicks.ca fwd=“50.18.57.7”dyno=web.1连接=1ms服务=30000ms状态=503字节=0

您通常会看到这种模式,其中一个长时间运行的操作开始占用队列中所有进一步的请求

Heroku路由器将在30秒后丢弃长时间运行的请求,但其背后的dyno将继续处理该请求,直到完成。不过,路由器没有意识到这一点,所以它会向繁忙的dyno发送新的请求。这种影响趋于复合,您将在NewRelic中看到排队,甚至对于不相关的URL(如静态资源),最终也会看到H12错误

您可能需要安装rack timeout之类的东西,这将确保长时间运行的请求也在dyno级别被丢弃。具体来说,机架超时会在发生这种情况时引发TimeoutError

有了这一点,复合效应就不太可能发生,但长期运行的行动仍然需要解决。New Relic是一个很好的工具,可以提供应用程序的可见性,以识别长期运行的操作。然后您可以优化它们,确保它们能够在合理的时间内完成,我建议将所有请求保持在500毫秒以下。如果他们正在执行任何固有的长任务,您应该尝试将这些任务转移给后台工作人员


如果你有一个流量更高的应用程序,我也建议你使用,如果你还没有,那么你的应用程序可以处理并发请求。这将为您提供更多的并发性,有助于缩短队列时间,并为您提供更多的整体性能

谢谢,尼尔。这就解释了为什么请求的日志阻塞会在15分钟后再次出现。我部署了rack timeout以防止请求排队并获得更好的堆栈跟踪,但我仍然不理解长时间运行请求的根本原因。我的应用程序很简单,没有外部依赖关系,当应用程序运行时,没有超过100毫秒的请求。我的直觉是,我的Rails应用程序和Heroku Postgres之间的连接存在一些问题(例如,一个陈旧的连接在15分钟后超时)。