JRuby on Rails with Pumaでマルチスレッドに動作させる

最近、JRuby on RailsPumaを使うことになったのでメモがてら残しておきます。

一般にRuby on Railsでリクエストを同時に処理したい場合、マルチプロセスで立ち上げたりUnicornのように複数のworkerを立ち上げたりしますが、Pumaの場合1プロセスに複数スレッドを立ち上げてリクエストを処理することが可能です。*1

Pumaでスレッドプールを指定する場合、-t--threadsオプションに最小スレッド数:最大スレッド数の形で指定ができます。(デフォルトは0:16です)

$ bundle exec puma -t 8:32

Puma starting in single mode...
* Version 2.8.1 (jruby 1.9.3), codename: Sir Edmund Percival Hillary
* Min threads: 8, max threads: 32
* Environment: development
* Listening on tcp://0.0.0.0:9292

puma.rb(PumaのConfig)に指定する場合、以下の記述が可能です。

threads 8,32

Configに指定した場合は-Cオプションでパスを指定します。

bundle exec puma -C config/puma.rb

また、Rails4以前の場合、マルチスレッドがデフォルトで有効となっていないため、production.rbやdevelopment.rbに下記を追記する必要があります。

config.threadsafe!

*1:Pumaで複数のworkerを起動させることもできるようですが、JRubyには対応していません。