Railsでpumaやsidekiqのスレッド数とコネクションプールの数ってどうやって決めるんですか
https://dev.icare.jpn.com/dev_cat/how-do-you-determine-the-number-of-threads-and-connection-pools-for-puma-and-sidekiq-in-rails
Railsでpumaやsidekiqのスレッド数とコネクションプールの数ってどうやって決めるんですか
前提
rails newをすると
pumaのスレッド数はデフォルト5
データベースのコネクションプール数も5
MRIにおける複数スレッド環境で全体のうちどれくらい並列に実行できるかの割合は、どれくらいIO待ちが生じているかに依存する
MRIにはGILがあるので同時に動けるのは1スレッドのみ
別のスレッドが動くのはIO待ちなどでロックを開放したとき
ohbarye.iconアムダールの法則
RailsではDB接続はコネクションプール経由で行う
毎回DBに接続して処理が終わったら切断するより一度接続したコネクションを使いまわすほうが効率が良いため
スレッド数の決め方
IO待ちしている時間はAPMサービスで測定する
大抵のアプリケーションサーバのIO待ち時間は50%未満 = スレッド数5は妥当
Puma 4では、スレッドのデフォルト数が16から5に減らされた
Rails 7.2からpuma thread数のデフォルトが5から3になる
ohbarye.icon Nate Berkopecのpost: コア数とワーカー数の決め方
https://us11.campaign-archive.com/?u=1aa0f43522f6d9ef96d1c5d6f&id=f604ac8d56
CPU負荷が80%となるよう目指す
75%がIO wait、25%の使用率であれば1コアに対し3 workersいれば75%
コネクションプール数の決め方
ActiveRecord connection poolはプロセスで利用するスレッド数と同じにする
puma以外でスレッドを使う場合
アプリケーションコード中で手動でスレッドを生成して、その中でDB接続するような箇所があったらその分コネクションプールの数を足す
ohbarye.icon Asynchronous Queries in ActiveRecordを導入する場合は追加が必要
sidekiqを使う場合はconcurrencyの設定を見る
6以上ならDBのpool数もそれに合わせて増やさないと、6以上のワーカースレッドがDB接続するタイミングでActiveRecord::ConnectionTimeoutErrorになる可能性がある
ActionCableをアプリケーションと併用(1プロセスでHTTPもwebsocketも対応する)する場合、ActionCable用のワーカースレッドの分もプール数を増やす