2020年5月17日日曜日

puma 最速入門 (Sinatra編)

概要

puma/puma は簡単に言えば Ruby で Web アプリケーションを動作させるための Web Server です
単体では Web アプリケーションとして動作せず Rails や Sinatra と組み合わせて使います
今回は Sinatra と組み合わせて使い方を紹介します

環境

  • Ruby 2.7.1p83
  • Sinatra 2.0.8.1
  • puma 4.3.3

インストール

  • bundle init
  • vim Gemfile
gem "puma"
gem "sinatra"
  • bundle config path vendor
  • bundle install

とりあえず動かしてみる

Sinatra は puma がインストールされている場合は WEBrick ではなく puma を優先的に使います
なので特に何も記載することなく自動的に puma を使ってくれます

  • vim config.ru
require './app.rb'
run WebApp
  • vim app.rb
require 'sinatra/base'

class WebApp < Sinatra::Base
  get '/' do
    'ok'
  end
end

これで起動すると自動的に puma で Sinatra が起動します

  • bundle exec rackup config.ru
Puma starting in single mode… * Version 4.3.3 (ruby 2.7.1-p83), codename: Mysterious Traveller * Min threads: 0, max threads: 16 * Environment: development * Listening on tcp://127.0.0.1:9292 * Listening on tcp://[::1]:9292 Use Ctrl-C to stop

config/puma.rb を書いて puma をチューニングする

puma は config/puma.rb を記載することで自分でいろいろとカスタマイズすることができます
例えば以下のように記載することで 3 つのワーカープロセスが動作することで cluster mode として動作させることができます

  • vim config/puma.rb
workers 3
preload_app!
  • bundle exec rackup config.ru
[23514] Puma starting in cluster mode… [23514] * Version 4.3.3 (ruby 2.7.1-p83), codename: Mysterious Traveller [23514] * Min threads: 0, max threads: 16 [23514] * Environment: development [23514] * Process workers: 3 [23514] * Preloading application [23514] * Listening on tcp://127.0.0.1:9292 [23514] Use Ctrl-C to stop [23514] - Worker 0 (pid: 23515) booted, phase: 0 [23514] - Worker 1 (pid: 23516) booted, phase: 0 [23514] - Worker 2 (pid: 23517) booted, phase: 0

確かに先ほどと違って worker プロセスが 3 つほど起動しているのがわかります
マシンリソースとの相談ですが worker プロセスの数を増やすことで多くのリクエストを並列にさばくことができます

worker が起動する際に何か処理をさせたい場合

on_worker_boot を定義することでワーカー起動時に何かしら処理をさせることができます
基本的には初期化処理になるのでロギングの設定やコネクションチェックなど行うと良いと思います

  • vim config/puma.rb
workers 3
preload_app!

on_worker_boot do
  puts 'Before worker fork...'
end
  • bundle exec rackup config.ru
[23584] Puma starting in cluster mode… [23584] * Version 4.3.3 (ruby 2.7.1-p83), codename: Mysterious Traveller [23584] * Min threads: 0, max threads: 16 [23584] * Environment: development [23584] * Process workers: 3 [23584] * Preloading application [23584] * Listening on tcp://127.0.0.1:9292 [23584] Use Ctrl-C to stop Before worker fork… Before worker fork… [23584] - Worker 0 (pid: 23585) booted, phase: 0 Before worker fork… [23584] - Worker 1 (pid: 23586) booted, phase: 0 [23584] - Worker 2 (pid: 23587) booted, phase: 0 ^C[23584] - Gracefully shutting down workers… [23584] === puma shutdown: 2020-05-15 09:33:47 +0900 === [23584] - Goodbye!

ちなみに定義できるハンドラは dsl.rb で確認できます

起動するポートを変更する

port を使います

  • vim config/puma.rb
workers 3
preload_app!

on_worker_boot do
  puts 'Before worker fork...'
end

port 9999

などなどいろいろ設定できるので dsl.rb を確認してみてください

最後に

Sinatra を使って puma のチューニング方法を簡単に紹介しました
プロファイリングや負荷テストなどしながらやるとベストな設定が見つけられると思います
リバースプロキシなどを挟んでいる場合はそちらのチューニングも見る必要があるので注意しましょう
基本的にはリバースプロキシが捌けるであろうリクエスト数よりも puma のほうが多くリクエストを捌ける必要があると思います

参考サイト

0 件のコメント:

コメントを投稿