首页 > 解决方案 > Heroku 应用程序在 H12 错误后何时开始工作?

问题描述

H12当我在 Rails 应用程序上遇到错误时,如果我heroku restart立即备份并运行。

什么时候(如果有的话)应用程序会在没有 的情况下重新开始工作heroku restart?(例如,heroku 应用程序是否会定期自动重启,或者内存是否会定期清除,或者其他什么?)

标签: heroku

解决方案


H12 错误意味着请求的处理时间超过 30 秒。这不一定是内存问题的迹象。

您的 ruby​​ 应用程序只能同时处理有限数量的请求。那是线程数 * 您的 Web 服务器(独角兽或美洲狮)正在启动的进程数。

当您有长时间运行的请求时,例如由于文件上传、调用底层 API 或慢速 SQL 查询,该请求会占用这些有限插槽之一。如果你有太多这些,任何新的传入请求都必须等到一个可用的插槽。

当 Heroku 终止一个耗时超过 30 秒的 HTTP 请求时,它无法告诉您的应用程序是否需要取消该请求。因此,如果您有一个很长的请求队列,您最终可能会处于这样一种状态,即所有请求甚至在应用程序开始处理它们之前都以 H12 形式结束。

重新启动应用程序会修复它,因为它会清除请求队列。

解决这个问题的最好方法是使用像rack-timeout这样的 gem ,它会杀死任何比你设置的时间更长的请求。一个合理的值是大约 1 或 2 秒。

请参阅 Heroku 开发中心的超时文档:https ://devcenter.heroku.com/articles/request-timeout

请注意,如果您有长时间运行的 SQL 查询,您的数据库也会发生同样的问题。因此,在 SQL 查询上设置语句超时也是一件好事:https ://devcenter.heroku.com/articles/heroku-postgres-database-tuning#identify-and-fix-expensive-queries


推荐阅读