Railsでpumaやsidekiqのスレッド数とコネクションプールの数ってどうやって決めるんですか
前提
MRIにおける複数スレッド環境で全体のうちどれくらい並列に実行できるかの割合は、どれくらいIO待ちが生じているかに依存する 別のスレッドが動くのはIO待ちなどでロックを開放したとき RailsではDB接続はコネクションプール経由で行う 毎回DBに接続して処理が終わったら切断するより一度接続したコネクションを使いまわすほうが効率が良いため
スレッド数の決め方
大抵のアプリケーションサーバのIO待ち時間は50%未満 = スレッド数5は妥当
Puma 4では、スレッドのデフォルト数が16から5に減らされた
CPU負荷が80%となるよう目指す
75%がIO wait、25%の使用率であれば1コアに対し3 workersいれば75% コネクションプール数の決め方
puma以外でスレッドを使う場合
アプリケーションコード中で手動でスレッドを生成して、その中でDB接続するような箇所があったらその分コネクションプールの数を足す 6以上ならDBのpool数もそれに合わせて増やさないと、6以上のワーカースレッドがDB接続するタイミングでActiveRecord::ConnectionTimeoutErrorになる可能性がある
ActionCableをアプリケーションと併用(1プロセスでHTTPもwebsocketも対応する)する場合、ActionCable用のワーカースレッドの分もプール数を増やす