【问题标题】:Concurrency database connections Heroku Unicorn rails app并发数据库连接 Heroku Unicorn rails app
【发布时间】:2014-05-20 13:39:24
【问题描述】:

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

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

我的应用在 Unicorn 上运行。但是当进行多个数据库调用时,它仍然很慢。

这是我的 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 应用程序的人能指出我正确的方向,我将不胜感激。

【问题讨论】:

  • 在我看来,每个数据库连接都需要一个“独角兽”工作者。每个工人都有一个连接。当然,我从来没有使用过独角兽,这正是使用fork的样子。

标签: ruby-on-rails postgresql heroku unicorn heroku-postgres


【解决方案1】:

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

NewRelic Stark 计划(推荐) - 或 Wayne 计划(我认为有点过于有限)是免费的,将帮助您可视化应用程序性能和跟踪错误。您可能会发现测功机排队时间和内存消耗会导致您的速度变慢,并且有几种方法可以改善这种情况而不会弄乱数据库连接。改善代码响应时间和限制数据库命中(通过缓存)是值得研究的好领域。

话虽如此,我建议您按照您提到的文章中的说明将以下代码添加到您的 unicorn 文件中。

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

【讨论】:

  • 我会把它放在文件的哪个部分?最后?
  • 是的,只需在 before_fork 块之后附加到文件末尾
  • 对不起,我不清楚,我是替换当前的 after_fork 块还是将其放在当前的 after_fork 块下?
  • 啊,没有prb,我编辑了代码块,以便您可以完全使用它,并替换旧的
【解决方案2】:

Heroku 提供托管的 Postgres 数据库。 不同的分层数据库有不同的连接限制。 Starter Tier “Dev” 和 “Basic” 数据库限制为 20 个连接。

还有一个工人需要一个连接。 如果您的工人超过 20 人,您可以使用 pgbouncer 之类的连接池来解决问题。 如果您使用 pgbouncer ,您应该在您的环境中使用事务池模式,以便服务器可以在工作人员之间重用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2015-03-28
    • 2013-06-26
    • 2014-03-04
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多