Rails activerecord pool和Sidekiq多线程

时间:2013-07-19 08:19:09

标签: ruby-on-rails ruby sidekiq

我正在使用sidekiq和rails3。 Sidekiq默认运行25个线程。我想增加多线程限制,我通过改变sidekiq.yml来做到这一点。

那么,database.yml中的池值与sidekiq多线程之间的关系是什么。 mysql池的最大值是多少?是否取决于服务器内存?

sidekiq.yml

:verbose: true
:concurrency:  50
:pool: 50
:queues:
  - [queue_primary, 7]
  - [default, 5]
  - [queue_secondary, 3]

的database.yml

production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: db_name
  pool: 50
  username: root
  password: root
  socket: /var/run/mysqld/mysqld.sock

1 个答案:

答案 0 :(得分:6)

每个Sidekiq作业在您的配置中最多50个线程中的一个执行。在作业内部,只要ActiveRecord模型需要访问数据库,它就会使用此过程中所有ActiveRecord模型共享的可用连接池中的数据库连接。连接池允许线程进行连接或阻塞,直到有空闲连接可用。

如果ActiveRecord数据库连接池中的连接数少于运行Sidekiq作业/线程,则作业将被阻塞,等待连接并可能超时(约5秒后)并失败。

这就是为什么在sidekiq工作进程中拥有尽可能多的可用数据库连接非常重要的原因。

Unicorn是一个单线程,多进程服务器 - 因此每个Unicorn后端工作进程不需要多个连接。

但是,数据库只能处理这么多连接(取决于操作系统,硬件和配置限制),因此您需要确保在需要的地方分发数据库连接,而不是超过最大值。

例如,如果您的数据库限制为1000个连接,那么您只能运行20个sidekiq进程,每个进程包含50个线程,而不是其他任何进程。