【发布时间】:2019-09-25 18:32:05
【问题描述】:
当我在 Rails 应用程序上遇到 H12 错误时,如果我 heroku restart 它会立即备份并运行。
如果没有heroku restart,应用何时(如果有的话)重新开始工作? (例如,heroku 应用程序是否会定期自动重启,或者内存是否会定期清除,或者其他什么?)
【问题讨论】:
标签: heroku
当我在 Rails 应用程序上遇到 H12 错误时,如果我 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
【讨论】: