Help us understand the problem. What is going on with this article?

nginx+puma+rails の worker,thread,connection pool 数の目安

More than 1 year has passed since last update.

※間違ってたら指摘を...

前提

MRI(Matz's Ruby Implementation) の前提, JRubyの場合は考え方が変わる。

nginx の worker 数の目安

CPUコア数を基本とする。ただし...

一方で、例えば僕の用途では、現在画像の処理だったりとか、ngx_mrubyのようにリクエストの過程で一部ブロッキングされるような処理も増えてきているため、コア数以上の値に設定しておいた方が性能を発揮できるような状況も増えてきています。
nginxのworkerプロセス数をCPUコア数の倍数で自動的に設定できるモジュールを書いた - 人間とウェブの未来

上記のようにコア数以上に設定した方が良いケースも時としてあるようです。

nginx の worker 数を設定する

以下のように conf を設定してあげれば、nginxがコア数に応じたプロセスを立ち上げてくれる。

/etc/nginx.conf
worker_processes auto;

puma の worker 数の目安

CPUコア数〜1.5倍を基本とする

Use cluster mode and set the number of workers to 1.5x the number of cpu cores in the machine, minimum 2.
https://github.com/puma/puma/blob/master/docs/deployment.md

puma の thread 数の目安

Set the number of threads to desired concurrent requests / number of workers. Puma defaults to 16 and that's a decent number.

デフォルトの 16 therad (1プロセスあたり)はちょうど良いくらいの設定らしい?

Watching your CPU utilization over time and aim for about 70% on average. This means you've got capacity still but aren't starving threads.

目安としてはCPU使用率が平均して70%程度となる状態を目指す。その状態であればカツカツではないけどある程度キャパシティを活用している状態と言えるとのこと。

MRIはGILによって1プロセスの中で同時に動作するスレッドは1スレッドのみに制限されるが、スレッド内でのIO待ち(DB,ファイル等)の間に別スレッドでリクエスト処理できるので、そこそこ効果はあると言われている。

database の connection pool 数の目安

puma の thread 数と同数とする。
database.yml に設定された pool の数はプロセスごとに確保される値なので、thread数を設定すれば十分。

If you are using the Puma web server we recommend setting the pool value to equal ENV['RAILS_MAX_THREADS']
Concurrency and Database Connections in Ruby with ActiveRecord | Heroku Dev Center

puma の worker 数, thread 数, db の connection pool 数 を設定する

手元の Rails 5.1.3 では thread 数と connection pool 数は、環境変数 RAILS_MAX_THREADS に従うようになっていました。

puma の worker 数は環境変数 WEB_CONCURRENCY に従うような設定が記述されていますが、デフォルトでコメントアウトされているのでアンコメントして有効化する必要があります。

config/puma.rb
# thread数
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count

# worker プロセス数
workers ENV.fetch("WEB_CONCURRENCY") { 2 }

db の connection pool 数は、デフォルトで RAILS_MAX_THREADS に従うようになっています。

config/database.yml
default: &default
 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

以下は要確認

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away