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

时间:2014-08-08 16:06:47

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

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文件中的代码完全相同。除了unicorn文件之外,我们还需要这个吗?

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)

2 个答案:

答案 0 :(得分:0)

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

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

最好的选择可能是启动克隆或fork the Heroku app之类的制作,尝试使用一致负载的不同配置,收集数据然后做出明智的决定。

我相信,例如,如果你有3x Unicorn进程,那么你可能需要3x 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

答案 1 :(得分:0)

Sidekiq数据库池大小和Web数据库池大小应该不相同,也可以不相同。

template <typename T>
void fun(T&& x); 

int i;
fun(i); // deduce<int&>(int& &&) -> deduce<int&>(int&)
fun(5); // deduce<int>(int&&)

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

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

因此,在我们的示例中,为Sidekiq服务时,数据库池将为8,而为应用程序服务器(在本例中为Puma)时,数据库池将为10。