1

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

那么,database.yml 中的 pool 值和 sidekiq 多线程有什么关系。mysql池的最大值是多少。它取决于服务器内存吗?

sidekiq.yml

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

数据库.yml

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

1 回答 1

6

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

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

这就是为什么在 sidekiq 工作进程中拥有与线程一样多的可用数据库连接很重要的原因。

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

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

例如,如果您的数据库限制为 1000 个连接,则您只能运行 20 个 sidekiq 进程,每个进程有 50 个线程,除此之外别无其他。

于 2013-08-06T14:52:20.147 回答