heroku - Heroku 应用程序在 H12 错误后何时开始工作?
问题描述
H12
当我在 Rails 应用程序上遇到错误时,如果我heroku restart
立即备份并运行。
什么时候(如果有的话)应用程序会在没有 的情况下重新开始工作heroku restart
?(例如,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
推荐阅读
- django - 没有在我的 django 项目中使用 gunicorn 创建 Sock 文件
- javascript - 试图只显示一种形式
- r - R提取随机均匀样本并创建数据帧
- python - SQLAlchemy,在日期范围在另一个表的日期范围内的表列中选择值的最佳方法是什么?
- dictionary - 如何从中心点计算矩形的纬度和经度
- python - 如何使用用户输入来关闭或继续 while 循环
- php - 如何避免用户在 WooCommerce 中编辑某些帐单地址字段?
- python - 使用 Python 等待页面元素(xpath)出现在 Selenium Webdriver 中的最有效方法是什么?
- android - 如何(本地)使用 Firebase Cloud Storage 对存储图像进行单元测试
- javascript - 如何从当前日期设置输入字段的最大日期