Skip to content

Commit b4874c4

Browse files
authored
Merge pull request #356 from MITLibraries/use-396
Update Puma config
2 parents 0906439 + 6ae1768 commit b4874c4

3 files changed

Lines changed: 31 additions & 29 deletions

File tree

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ gem 'mitlibraries-theme', git: 'https://github.com/mitlibraries/mitlibraries-the
1313
gem 'openssl'
1414
gem 'puma'
1515
gem 'rack-attack'
16+
gem 'rack-timeout'
1617
gem 'rails', '~> 7.2.0'
1718
gem 'redis'
1819
gem 'scout_apm'

Gemfile.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ GEM
244244
rack (>= 3.0.0)
245245
rack-test (2.2.0)
246246
rack (>= 1.3)
247+
rack-timeout (0.7.0)
247248
rackup (2.2.1)
248249
rack (>= 3)
249250
rails (7.2.2.2)
@@ -426,6 +427,7 @@ DEPENDENCIES
426427
pg
427428
puma
428429
rack-attack
430+
rack-timeout
429431
rails (~> 7.2.0)
430432
redis
431433
rubocop

config/puma.rb

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,33 @@
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)
44

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.
721
#
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:
1123
#
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+
# ```
1627
#
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:
1930
#
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

Comments
 (0)