【问题标题】:Setting the correct connection pool size for Sidekiq on heroku在 heroku 上为 Sidekiq 设置正确的连接池大小
【发布时间】:2014-10-02 04:18:35
【问题描述】:

sidekiq docs say you should increase your AR pool size 到大约 25 个连接。

production:
  adapter: mysql2
  database: foo_production
  pool: 25

如果你使用 Heroku,you can't use application.yml。相反,您需要使用unicorn.rb 配置文件(如果您使用的是独角兽):

after_fork do |server, worker|
  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']      || 25

    ActiveRecord::Base.establish_connection(config)
  end
end

但是每个 Dyno 运行 3 个进程。我有一个网络 Dyno 和一个工人 Dyno。这是否意味着最大池大小为 150? 2 * 3 * 25?

后来,导游说we should include an initializer file。但它几乎与unicorn.rb 文件中的代码相同。除了独角兽文件,我们还需要这个吗?

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'] || 5
ActiveRecord::Base.establish_connection(config)

【问题讨论】:

    标签: ruby-on-rails ruby activerecord heroku unicorn


    【解决方案1】:

    Sidekiq 数据库池大小和 Web 数据库池大小不应相同或可能不同。

    require 'sidekiq'
    
    Sidekiq.configure_server do |config|
      ActiveRecord::Base.configurations['production']['pool'] = ENV["SIDEKIQ_DB_POOL_SIZE"] || 8
    end
    

    如果我们将 Sidekiq 并发设置为 8 ,则数据库池大小也必须设置为 8。这样数据库就可以同时为来自 Sidekiq 的 8 个线程提供服务。

    这与 Web 服务器不同。假设我们使用 Puma 服务器,其中 1 个工作线程运行 10 个线程,数据库必须根据 database.yml 中的池配置为来自 Puma 服务器的 10 个线程提供服务。

    回顾一下,在我们的示例中,为 Sidekiq 提供服务时 DB 池为 8,在为应用服务器提供服务时为 10(在本例中为 Puma)。

    【讨论】:

    • 我认为仅仅通过更改 ActiveRecord::Base.configurations 哈希,您实际上并没有应用该更改。之后你可能会错过ActiveRecord::Base.establish_connection(:production) 之类的东西,或者更好的是ActiveRecord::Base.establish_connection(ActiveRecord::Base.connection_config.dup.tap{ |config| config[:pool] = })
    • 实际上,为了更完整的设置(断开之前的池,不留下任何幽灵连接),请查看stackoverflow.com/q/64880202/1290457中的设置
    【解决方案2】:

    我有类似的问题和寻找明确答案的问题!

    像许多其他计算问题一样,我认为没有明确的答案,每种情况都是不同的,并且取决于许多因素,例如 Heroku 配置、Rails 配置、应用程序配置文件、使用的 Rails Web 服务器等。

    最好的选择可能是启动像 clone 或 fork the Heroku app 这样的产品,并尝试不同的配置和一致的负载,收集数据,然后做出明智的决定。

    我相信,例如,如果您有 3x Unicorn 进程,那么您可能需要 3x DB_POOL - 尽管 ActiveRecord 会在需要时懒惰地启动这些连接。

    我已经使用config/initializers/sidekiq.rb 中的配置来获取数据库 url 来配置 Sidekiq,类似于;

    Sidekiq.configure_server do |config|
    
      # ...
    
      database_url = ENV['DATABASE_URL']
      if database_url
        pool_size = Sidekiq.options[:concurrency] # one example of what this could be...
        ENV['DATABASE_URL'] = "#{database_url}?pool=#{pool_size}" # only affects this process
        ActiveRecord::Base.establish_connection
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      相关资源
      最近更新 更多