【问题标题】:A slow postgres query on Heroku is not being interrupted by rack-timeoutHeroku 上的缓慢 postgres 查询不会被 rack-timeout 中断
【发布时间】:2012-01-20 16:52:42
【问题描述】:

我没有太多运气通过谷歌找到信息,也许这里有人遇到过类似的问题。

我们有一个使用 Postgres DB 在 Heroku 上运行的 rails 应用程序。我们有一个特别慢的查询(是的,我们正在修复查询),但是在调试这个问题的过程中,我观察到我们的 rack-timeout gem 没有在 15 秒时终止请求。我已经通过插入 sleep(50) 进行了侧面测试,果然,在这种情况下,机架超时工作正常。

这是我们日志的编辑副本,显示机架时间(时间到了!)发生在几分钟后,我们仍然在 30 秒后看到 H12 请求超时。

    2011-12-14T21:15:16+00:00 app[web.2]: Started GET "/search?utf8=%E2%9C%93&terms=foo" for 173.164.186.205 at Wed Dec 14 13:15:16 -0800 2011
    2011-12-14T21:15:16+00:00 app[web.2]: search query elapsed time => [0.000365018844604492]
    2011-12-14T21:15:46+00:00 heroku[router]: Error H12 (Request timeout) -> GET /search dyno=web.2 queue= wait= service=30000ms status=503 bytes=0
    2011-12-14T21:18:47+00:00 app[postgres]: [6-1] [removed] [COBALT] LOG:  duration: 211241.725 ms  statement: SELECT  [truncated]
    2011-12-14T21:18:47+00:00 app[web.2]: 
    2011-12-14T21:18:47+00:00 app[web.2]: ActionView::Template::Error (Timeout::Error: time's up!: SELECT  [truncated]):

对为什么以及如何强制执行机架超时有任何见解吗?

【问题讨论】:

    标签: ruby-on-rails-3 postgresql heroku rack


    【解决方案1】:

    是的,这里发生的就是我所说的僵尸测功机。 30 秒超时发生在 Dyno 上方的路由网格中。理论上,您的测功机可以运行数小时,但用户会在 30 秒后直接从路由网格中看到错误。

    所以。发生了什么是这样的:

    1. 您的请求是在21:15:16 提出的
    2. 21:15:46 路由网格返回错误,但您的测功机仍在处理中
    3. 21:18:47,您的请求完成。

    至于 Rack::Timeout 和您长时间运行的查询发生了什么,它可能取决于您使用的 pg gem,因为 Rack::Timeout 依赖于线程才能正常运行。这解释了为什么在数据库返回时会出现超时。

    关于僵尸测功机的更多信息:http://neilmiddleton.com/avoiding-zombie-dynos-with-heroku/

    【讨论】:

    • 感谢您的回复。我正在寻找的是深入了解如何强制机架超时来切断请求。我们使用的是 heroku,我们没有指定 pg_gem,heroku 有。我们使用的是 9.0.6 版本的非共享数据库。
    • 不幸的是,Rack Timeout 无法终止正在运行的查询。您的应用程序将在 Heroku 上使用 pg gem,因为它是由 slug 编译过程注入的。
    【解决方案2】:

    在 postgres 9.2 出现之前(它有更好的超时系统),rack-timeout gem 没有一个简单的解决方案 - postgres 只检查语句之间的连接中断,因此 rack-timeout 在这方面有些限制。它的手被束缚了......如果您拥有对 postgres 的超级用户访问权限,您也许可以尝试一些配置调整,但由于您使用的是 heroku,所以这不是一个选择。

    尝试优化您的数据库调用(确保所有索引都在那里,等等),或者针对这个特定问题将您的单个语句分成更小的块(这可能看起来违反直觉)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2014-09-06
      • 2017-04-26
      相关资源
      最近更新 更多