Heroku - 为什么在将发布版推送到Heroku时会出现错误R12(退出超时)?

时间:2014-11-21 02:02:40

标签: heroku unicorn heroku-postgres

偶尔,每当我收到以下错误(我正在运行2 512MB dynos)后不久我就会向Heroku推送一个版本:

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

我正在使用独角兽应用程序服务器,不幸的是每个512MB dyno只有1个独角兽工作者(因为在它的高峰期,我的应用程序RSS是320MB - 是的,去看看,有些臃肿正在发生)。不确定这是否有帮助,但我在启用预启动的Cedar14上。 UNICORN_WORKERS设置为1。

这是我的独角兽设置。我应该关注这个错误吗?

虽然我们讨论的是这个话题,但是我的2个dynos的db pool size 15太大了(我使用Postgres标准,允许多达120个并发连接)。

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

1 个答案:

答案 0 :(得分:9)

Heroku在部署时有一个规则基本上就是这样说:

  • 当你的dyno要重启时,Heroku会很好地让你的过程自行关闭。这使他们有机会做一些很好的事情,如关闭开放数据库连接等。
  • 如果您的进程在10秒内没有关闭,您将收到上述错误,并且Heroku将强行终止您的进程以重新启动它。

这样做是为了确保您没有运行大量账单,因为您的某个进程从未退出。

在你的情况下发生了什么(我在这里推测),是你有很多开放的数据库连接,关闭它们需要10秒以上,因为:

  • 您有一些数据库延迟。
  • 你的DB负担其他东西。
  • 您的应用程序根本无法关闭&lt; 10秒。

总的来说,这不是什么大问题。这个问题随着时间推移自行排除,所以我不担心。