【问题标题】:Rails3 active record pool and Sidekiq multi-threadRails3 活动记录池和 Sidekiq 多线程
【发布时间】:2013-08-15 19:03:42
【问题描述】:

我正在使用带有 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

【问题讨论】:

    标签: ruby-on-rails ruby sidekiq


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我不应该不仅考虑sidekiq,还要考虑Unicorn workers等设置池大小吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2011-07-11
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多