我正在使用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
答案 0 :(得分:6)
每个Sidekiq作业在您的配置中最多50个线程中的一个执行。在作业内部,只要ActiveRecord模型需要访问数据库,它就会使用此过程中所有ActiveRecord模型共享的可用连接池中的数据库连接。连接池允许线程进行连接或阻塞,直到有空闲连接可用。
如果ActiveRecord数据库连接池中的连接数少于运行Sidekiq作业/线程,则作业将被阻塞,等待连接并可能超时(约5秒后)并失败。
这就是为什么在sidekiq工作进程中拥有尽可能多的可用数据库连接非常重要的原因。
Unicorn是一个单线程,多进程服务器 - 因此每个Unicorn后端工作进程不需要多个连接。
但是,数据库只能处理这么多连接(取决于操作系统,硬件和配置限制),因此您需要确保在需要的地方分发数据库连接,而不是超过最大值。
例如,如果您的数据库限制为1000个连接,那么您只能运行20个sidekiq进程,每个进程包含50个线程,而不是其他任何进程。