|
1 | | -# This configuration file will be evaluated by Puma. The top-level methods that |
2 | | -# are invoked here are part of Puma's configuration DSL. For more information |
3 | | -# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html. |
| 1 | +# Thread per process count allows context switching on IO-bound tasks for better CPU utilization. |
| 2 | +threads_count = ENV.fetch('RAILS_MAX_THREADS') { 3 } |
| 3 | +threads(threads_count, threads_count) |
4 | 4 |
|
5 | | -# Puma starts a configurable number of processes (workers) and each process |
6 | | -# serves each request in a thread from an internal thread pool. |
| 5 | +# Processes count, allows better CPU utilization when executing Ruby code. |
| 6 | +# Recommended to always run in at least one process so `rack-timeout` RACK_TERM_ON_TIMEOUT=1 can be used |
| 7 | +# https://devcenter.heroku.com/articles/h12-request-timeout-in-ruby-mri |
| 8 | +workers(ENV.fetch('WEB_CONCURRENCY') { 2 }) |
| 9 | + |
| 10 | +# Support IPv6 by binding to host `::` in production instead of `0.0.0.0` and `::1` instead of `127.0.0.1` in development. |
| 11 | +host = ENV.fetch("RAILS_ENV") { "development" } == "production" ? "::" : "::1" |
| 12 | + |
| 13 | +# PORT environment variable is set by Heroku in production. |
| 14 | +port(ENV.fetch("PORT") { 3000 }, host) |
| 15 | + |
| 16 | +# Allow Puma to be restarted by the `rails restart` command locally. |
| 17 | +plugin(:tmp_restart) |
| 18 | + |
| 19 | +# Heroku strongly recommends upgrading to Puma 7+. If you cannot upgrade, |
| 20 | +# Please see the Puma 6 and prior configuration section below. |
7 | 21 | # |
8 | | -# The ideal number of threads per worker depends both on how much time the |
9 | | -# application spends waiting for IO operations and on how much you wish to |
10 | | -# to prioritize throughput over latency. |
| 22 | +# Puma 7+ already supports PUMA_PERSISTENT_TIMEOUT natively. Older Puma versions set: |
11 | 23 | # |
12 | | -# As a rule of thumb, increasing the number of threads will increase how much |
13 | | -# traffic a given process can handle (throughput), but due to CRuby's |
14 | | -# Global VM Lock (GVL) it has diminishing returns and will degrade the |
15 | | -# response time (latency) of the application. |
| 24 | +# ``` |
| 25 | +# persistent_timeout(ENV.fetch("PUMA_PERSISTENT_TIMEOUT") { 95 }.to_i) |
| 26 | +# ``` |
16 | 27 | # |
17 | | -# The default is set to 3 threads as it's deemed a decent compromise between |
18 | | -# throughput and latency for the average Rails application. |
| 28 | +# Puma 7+ fixes a keepalive issue that affects long tail response time with Router 2.0. |
| 29 | +# Older Puma versions set: |
19 | 30 | # |
20 | | -# Any libraries that use a connection pool or another resource pool should |
21 | | -# be configured to provide at least as many connections as the number of |
22 | | -# threads. This includes Active Record's `pool` parameter in `database.yml`. |
23 | | -threads_count = ENV.fetch("RAILS_MAX_THREADS", 3) |
24 | | -threads threads_count, threads_count |
25 | | - |
26 | | -# Specifies the `port` that Puma will listen on to receive requests; default is 3000. |
27 | | -port ENV.fetch("PORT", 3000) |
28 | | - |
29 | | -# Allow puma to be restarted by `bin/rails restart` command. |
30 | | -plugin :tmp_restart |
31 | | - |
32 | | -# Specify the PID file. Defaults to tmp/pids/server.pid in development. |
33 | | -# In other environments, only set the PID file if requested. |
34 | | -pidfile ENV["PIDFILE"] if ENV["PIDFILE"] |
| 31 | +# ``` |
| 32 | +# enable_keep_alives(false) if respond_to?(:enable_keep_alives) |
| 33 | +# ``` |
0 commit comments