Heroku - 为啥在向 Heroku 推送版本时会出现错误 R12(退出超时)?
Posted
技术标签:
【中文标题】Heroku - 为啥在向 Heroku 推送版本时会出现错误 R12(退出超时)?【英文标题】:Heroku - why would I get Error R12 (Exit timeout) when pushing a release to Heroku?Heroku - 为什么在向 Heroku 推送版本时会出现错误 R12(退出超时)? 【发布时间】:2015-01-19 02:30:57 【问题描述】:有时,每当我在收到以下错误后不久向 Heroku 推送版本时(我正在运行 2 512MB dynos):
2014-11-21 00:38:30.216
188 <45>1 2014-11-21T00:38:29.163459+00:00 heroku web.2 - - Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM
我正在使用 unicorn 应用服务器,不幸的是,每个 512MB dyno 的每个 unicorn 工作者只有 1 个(因为在其高峰期,我的应用 RSS 为 320MB - 是的,去算一下,正在发生一些膨胀)。不确定这是否有帮助,但我在 Cedar14 上启用了 Preboot。 UNICORN_WORKERS
设置为 1。
这是我的独角兽设置。我应该关心这个错误吗?
当我们讨论这个话题时,对于我的 2 个 dynos,数据库池大小 15 是否太大(我使用的是允许多达 120 个并发连接的 Postgres 标准)。
worker_processes Integer(ENV['UNICORN_WORKERS'] || 2)
timeout Integer(ENV['UNICORN_TIMEOUT'] || 25)
preload_app true
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
if defined?(ActiveRecord::Base)
ActiveRecord::Base.connection.disconnect!
end
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
# other settings
if defined?(ActiveRecord::Base)
config = ActiveRecord::Base.configurations[Rails.env] || Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = Integer(ENV['DB_REAPING_FREQUENCY'] || 10)
config['pool'] = ENV['DB_POOL'] || 15
ActiveRecord::Base.establish_connection(config)
end
end
【问题讨论】:
关于上述配置的附注。真的DB_POOL
在独角兽世界中应该是 1 或 2(每个工作进程的连接数)。因此最好有ENV['DB_POOL'] || 2
。
【参考方案1】:
Heroku 在部署时有一条规则,基本上是这样说的:
当您的测功机要重新启动时,Heroku 会很好地要求您的进程自行关闭。这让他们有机会做一些好事,比如关闭打开的数据库连接等。 如果您的进程没有在 10 秒内自行关闭,您将收到上述错误,Heroku 将强制终止您的进程以重新启动它。这样做是为了确保您不会因为您的某个进程从未退出而产生巨额账单。
在你的情况下发生了什么(我在这里推测),你有很多打开的数据库连接,关闭它们需要超过 10 秒,因为:
您有一些数据库延迟。 您的数据库有其他负担。 您的应用程序根本无法在总的来说,这没什么大不了的。这个问题会随着时间的推移自行解决,所以我不会担心。
【讨论】:
谢谢!很高兴知道这不是一个大问题。除了我之外,目前没有人在使用该应用程序,而且我仅在git push heroku master
之后才出现问题(Logentries 向我发送警报)。关于数据库池大小,Heroku 推荐 2 似乎不是最佳选择,而显然可以利用更多(请参阅“因此,我们建议将应用程序的池设置为 1 或 2 以避免僵尸连接使数据库饱和。 "在devcenter.heroku.com/articles/…)。或者,如果我启用了 reaping,我可以忽略?
收割应该够好了。您的应用程序中是否有任何可能无法快速退出的长时间运行的代码?这通常是我检查内容的地方(例如,如果我在某处迭代大量内容的 for 循环等)。
谢谢...我没有任何长时间运行的任务,但我想知道 Heroku 的 Preboot 是否与它有关...devcenter.heroku.com/articles/preboot。我将继续保持关注。再次感谢!以上是关于Heroku - 为啥在向 Heroku 推送版本时会出现错误 R12(退出超时)?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不应该将 virtualenv 推送到 Heroku?
Error-Bundler 找不到 gem“bundle”的兼容版本:在 Heroku 上推送项目时