在heroku上为Sidekiq设置正确的连接池大小。

问题描述 投票:1回答:2

sidekiq文档说你应该增加你的AR池大小 到25个左右的连接。

production:
  adapter: mysql2
  database: foo_production
  pool: 25

如果你使用的是Heroku。不能用 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

但每个测功机都有三个进程 我有一个web Dyno和一个worker Dyno。这是否意味着最大的池子大小是150?

后来,指南上说 我们应该包含一个初始化文件. 但它几乎与在 "我 "中的代码完全相同。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
2个回答
0
投票

我也有类似的问题,也找不到明确的答案!

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

最好的选择可能是像克隆一样旋转生产或 叉叉 并尝试不同的配置与一致的负载,收集数据,然后做出明智的决定。

我相信,例如,如果你有3个Unicorn进程,那么你可能需要3个DB_POOL--尽管ActiveRecord会在需要的时候缓慢地启动这些连接。

我已经使用了以下配置 config/initializers/sidekiq.rb 来获取配置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

0
投票

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个worker运行10个线程,数据库必须根据database.yml中的池配置为来自Puma服务器的10个线程提供服务。

因此,在我们的例子中,当服务于Sidekiq时,DB池将是8个,而当服务于应用服务器(在本例中是Puma)时,将是10个。

© www.soinside.com 2019 - 2024. All rights reserved.