行動すれば次の現実

テック中心の個人ブログ

【Rails】Pumaのワーカー数、スレッド数とDB接続プール数の決め方

本記事では、Pumaのワーカー数、スレッド数の決め方、およびDB接続プール数の決め方と推奨値について解説します。

ワーカー数の決め方

基本的にはCPUの数に合わせることが推奨されます。

例えば、Herokuの場合、Standard-1XではCPU数が1なので、ワーカー数を「1」に設定し、Standard-2XではCPU数が2なので、「2」に設定するのが良いでしょう。

また、シングルコアCPUを使用している場合は、マルチプロセス構成よりもマルチスレッド構成を選択する方が効果的です。マルチコア環境では、ワーカー数を増やすことでパフォーマンスの向上や負荷の分散が期待できます。

スレッド数の決め方

スレッド数に関しては、5から20の範囲が無難です。

高負荷かつ長時間にわたる処理が多い場合は、スレッド数を少なめに設定することが望ましいです。

反対に、低負荷で高頻度の処理が多い場合は、スレッド数を多くすることが効果的です。 ただし、スレッド数を増やすとメモリ使用量も増加するため、最適な数値を見つけるためには実際にテストを行う必要があります。

経験則から、10から15の範囲が無難であると考えられます。

DB接続プール数

DB接続プール数は、DBのスペックやアプリケーションで必要となる同時接続数を考慮して決定します。

初期設定としては、5から20の範囲で始め、アプリケーションの実行状況を観察しながら最適な値に調整することをおすすめします。

特に、Sidekiqなどのバックグラウンドジョブライブラリを使用している場合は、スレッド数よりもDBコネクションプールの数を多く設定しないと、以下のような接続タイムアウトエラーが発生する可能性があります。

connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in  use(ActiveRecord::ConnectionTimeoutError)

このエラーはDB接続プールの不足が原因で発生することがあります。Sidekiqのデフォルトスレッド数は10なので、DB接続プール数は11以上を設定する必要があります。

終わりに

Pumaのワーカー数やスレッド数、DB接続プール数の設定は、アプリケーションの性能と安定性に大きな影響を与えます。これらの値はアプリケーションの実行状況やユーザーからの負荷によって異なりますので、定期的な監視と適切な調整が必要です。上記のガイドラインを参考に、最適な設定値を見つけることが重要です。

参考

https://devcenter.heroku.com/ja/articles/deploying-rails-applications-with-the-puma-web-server#recommended-default-puma-process-and-thread-configuration