1

rails3でsidekiqを使っています。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]

データベース.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 モデルによって共有される利用可能な接続のプールからデータベース接続を使用します。接続プールを使用すると、空き接続が使用可能になるまで、スレッドが接続またはブロックを取得できます。

Sidekiq ジョブ/スレッドを実行しているよりも ActiveRecord データベース接続プールで利用可能な接続が少ない場合、ジョブは接続を待機してブロックされ、タイムアウト (約 5 秒後) して失敗する可能性があります。

これが、sidekiq ワーカー プロセス内のスレッドと同じ数の利用可能なデータベース接続を持つことが重要な理由です。

Unicorn はシングルスレッドのマルチプロセス サーバーであるため、Unicorn バックエンド ワーカー プロセスごとに複数の接続は必要ありません。

ただし、データベースは非常に多くの接続しか処理できないため (OS、ハードウェア、および構成の制限によって異なります)、データベース接続を必要な場所に分散させ、最大数を超えないようにする必要があります。

たとえば、データベースの接続数が 1000 に制限されている場合、それぞれ 50 スレッドの sidekiq プロセスを 20 個しか実行できず、他には何も実行できません。

于 2013-08-06T14:52:20.147 に答える