Develop with pleasure!

福岡でCloudとかBlockchainとか。

ruby on puma

Rackアプリが動作するPumaっていうRubyのサーバ実装を発見。
Engine Yardのプロジェクトみたいね。プーマという名前からして速さがウリか?

A Modern, Concurrent Web Server for Ruby - Puma
puma/puma · GitHub

概要

Mongrelをベースに作られたサーバみたいで、WebrickMongrelの代替として考えられてる。
元々Mongrel自体はまだRackという考え方が無い時にできたサーバで、RubyのサーバがほぼRackなインタフェースをサポートするようになった現状から考えるとムダな実装もあるので、そういった実装を切り剥がした模様。ragelで書かれたMongrelのHTTPパーサはそのまま残し、RubiniusやJRubyのような並行性を持つRubyの実装を使うことを前提に設計されてて、リクエストを捌くのに内部のスレッドプール内のスレッドを使用し並行処理してる。
※ragelはステートマシンコンパイラで、コンパイラやパーサの字句解析を簡単に作れるらしく、HTTP Serverとか書くのに便利みたい。

一応全Rubyの実行環境で動作するみたいだけど、並行性を持つ実行環境で動作させた方がシンプルで高いパフォーマンスを発揮すると。Rubinius 2.0使って動作させるとリアルなスレッド使ってCPUの全てのコアを活用できる=スループットを向上させるために複数のプロセスを起動する必要がなくJRubyみたいな強みがあると。

MRIの実装を使うと、GIL(Global Interpreter Lock)の制限があるので結局同時に実行可能なスレッドは1つだけになるけど、そういう場合でも(TwitterAPI呼び出しみたいな)IOブロッキングが多いアプリにはPumaの並行性がスループット向上に繋がると。

他のサーバとの比較

↑の公式サイトで取り上げている内容だと

  • 他のRackサーバに比べて使用メモリが少ない
  • 同時リクエストを捌くのに有利
    Unicornをベースに1ワーカで複数リクエスト処理できるようにしてるRainbows!よりも多くのリクエストを捌いてる。

同時リクエストを捌くパフォーマンスはThin - yet another web serverとかと比較するとどうなのか気になる。

インストール&起動

#gemとしてインストール
$ gem install puma 
#Pumaの起動
$ puma 

と導入も簡単。

スレッドプールの最小/最大数やバインディングするTCPソケットの指定とかはコマンドラインオプションとして渡せる。あとpumaのインスタンス自体を制御する制御サーバを起動できたりすのも面白いな。


Passenger4のEnterprise版もマルチスレッドサポートするし、Rails4からconfig.threadsafe!の設定がなくなってデフォでスレッドセーフの設定が有効になるし、今後は今までのマルチプロセスシングルスレッドなランタイム構成からマルチスレッドベースの並行実行モデルにシフトしていくのかねー。