Pumaメモ

古いメモを転記しているので、間違っている箇所があるかも。

Systemdで起動する設定

/etc/systemd/system/puma.serviceファイルを以下の内容で作成する。

# /etc/systemd/system/puma.service ファイル
[Unit]
Description=Puma Application Server
After=network.target

[Service]
Type=simple
User=ユーザー名
WorkingDirectory=Railsのパス
Environment="RAILS_ENV=production"
# Environment=PUMA_DEBUG=1
ExecStart=/usr/local/rbenv/shims/bundle exec "puma -C Railsのパス/config/puma/production.rb"
TimeoutSec=300
Restart=always

[Install]
WantedBy=multi-user.target

設定ファイル

puma_worker_killerを使うならGemfileにgem 'puma_worker_killer'を追加すること。

# Railsのパス/config/puma/production.rb
max_threads_count = ENV.fetch('RAILS_MAX_THREADS', 5)
min_threads_count = ENV.fetch('RAILS_MIN_THREADS') { max_threads_count }
# 設定値としては5から16が目安らしいが、リソースとしてはCPU使用率70%が目安らしい。
threads min_threads_count, max_threads_count
workers 4 # 起動するワーカー数。CPUコア数x1〜1.5倍 が目安

state_path "Railsのパス/tmp/pids/puma.state"
pidfile "Railsのパス/tmp/pids/puma.pid"
bind "unix:///Railsのパス/tmp/sockets/puma.sock"

# 確認してないがNginxがソケット通信するならportの指定は不要なはず
# port ENV.fetch('PORT', 3000)

environment ENV.fetch('RAILS_ENV', 'production')

plugin :tmp_restart

before_fork do
  require 'puma_worker_killer'
  PumaWorkerKiller.config do |config|
    config.ram = 1024 # メモリの量(単位:MB、例:1024)
    config.frequency = 5 # メモリ使用量の確認頻度(単位:秒数、例:5)
    config.percent_usage = 0.65 # メモリ上限パーセント(65%に指定するなら0.65を指定、例:0.65)
    config.rolling_restart_frequency = 12 * 3600 # workerを強制再起動する間隔(単位:秒、例:12 * 3600)
    config.reaper_status_logs = false # 再起動のログを出力するかどうか(true or false)
  end
  PumaWorkerKiller.start
end

DBのコネクションプーリングの値については、workerごとにプーリングされるためworker数xthreads数ではなくthreads数の最大値を指定すればよい(結果としてコネクションプール数はworker数x指定したコネクションプール数になる)。