并发数据库连接 Heroku Unicorn rails 应用程序



我在Heroku上运行一个rails应用程序。

我有一个测功机。我正在使用Hobby Basic数据库,每月9美元,连接限制为20。

我的应用在独角兽上运行。但是,当进行多个数据库调用时,它仍然非常慢。

这是我的unicorn.rb文件中的内容:

# config/unicorn.rb
worker_processes 3
timeout 30
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
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
  end
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

本文讨论如何管理并发连接:https://devcenter.heroku.com/articles/concurrency-and-database-connections

但是,我仍然感到困惑。使用当前的设置,如何同时允许多个数据库连接?在我的数据库允许的最大连接数 (20) 下?如果这里有人在 Heroku 上处理过扩展 rails 应用程序,我将不胜感激,可以为我指出正确的方向。

假设

数据库在使用有限的爱好计划时可能是一个瓶颈是公平的。 无论如何,您都可以进行一些优化来帮助改善连接池(如下面的代码)。但是,当这确实是瓶颈时,您会期望发现超时经常发生,而不仅仅是缓慢。为了更好地了解您的问题所在,我建议接下来添加NewRelic插件。

NewRelic Stark计划(推荐)或Wayne计划(在我看来有点太有限了)是免费的,将有助于可视化应用程序性能和跟踪错误。 您可能会发现dyno排队时间和内存消耗导致您获得的缓慢,并且有几种方法可以在不弄乱数据库连接的情况下进行改进。 缩短代码响应时间和限制数据库命中(通过缓存)是值得研究的好方面。

话虽如此,我确实建议将以下代码添加到您的独角兽文件中,如您提到的文章中所述。

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
  end
  # other settings
  if defined?(ActiveRecord::Base)
    config = ActiveRecord::Base.configurations[Rails.env] ||
            Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
    config['pool']            =   ENV['DB_POOL'] || 2
    ActiveRecord::Base.establish_connection(config)
  end
end

Heroku 提供托管的 Postgres 数据库。不同的分层数据库具有不同的连接限制。入门层"开发"和"基本"数据库限制为 20 个连接。

以及工作人员所需的一个连接。如果你的工作线程超过20个,你可以使用连接池,如PGBouncer处理问题。如果使用 PGBouncer ,则应在环境中使用事务池模式,以便服务器可以在工作线程之间重用。

相关内容

最新更新