はじめに
Ruby 2.2.0がリリースされましたね!
相変わらず納期厳守で感服します。
Ruby 2.2.0はRails 5で必須となるSymbolGCやインクリメンタルGCが実装されたり、おまけにjemallocが使えるようになってたりと速くなってそうな雰囲気です。
というわけでRailsを使って軽くベンチマークしてみました。
測定対象
今回測定対象としたのは、次の3つです。
- Ruby 2.1.5
- Ruby 2.2.0
- Ruby 2.2.0 with jemalloc
ベンチマーク方法
RailsのアプリケーションにApache Benchをかけました。
ミドルウェア
アプリケーションサーバにはUnicorn、WebサーバにはNginxを使いました。
最初はRaptorを使おうとしてたんですが、まだ2.2.0に対応できていないようなのでやめました。
https://github.com/phusion/passenger/issues/1314
データベースにはPercona XtraDB Clusterを使いました。
アプリケーション
ベンチマークに使用したRailsのアプリはこちらです。
DBに書き込んで、書き込んだモデルをJSONとして返すだけのアプリです。
Railsのバージョンは4.1.4です。
Docker
環境の差異がなくなるようにアプリはDockerコンテナとして起動しました。
オフィシャルなRuby 2.2.0のイメージがなかったので、Rubyビルドするとこからイメージを作成しています。
インフラ
サーバはIDCFクラウドのVMを3台使用しました。
サーバ | CPU | Memory
---+---+---
アプリサーバ | 0.8GHz x 1 | 1GB
DBサーバ | 2.4GHz x 4 | 16GB
ベンチサーバ | 2.6GHz x 2 | 4GB
すべてCentOS 7.0です。
システム構成図
結果
Request/Sec のグラフです。
簡単なRailsアプリでは、2.1.5と2.2.0ではほぼ変わらず(微妙に2.2.0の方が遅い)という結果になってしまいました。
Rails 5に期待ですね。
jemallocさんは速い場合と遅い場合がありました。
有能さが確認されればjemallocが標準になるらしいです。
おわりに
軽いベンチマークでした。
結局速いのか遅いのかよくわからないという結果になってしまいました。
計測方法が適当なので、ちゃんとやれば変わりそうです。
2.2.0の方が速くなるパターンとかRails以外も計測してみたいですね。
(おまけ)アプリケーション起動方法
今回使用したRailsアプリはDockerhubにイメージを登録してるので、Dockerが動いていれば次のコマンドで起動できます。
$ docker run \
-e "DB_HOST=dbhost" \ # DBサーバのホスト or IP
-e "DB_USER=dbuser" \ # DBのユーザ
-e "DB_PASS=dbpass" \ # DBのパスワード
-e "SECRET_KEY_BASE=hogehoge" \ # Railsのsecret_key_base
-e "NEWRELIC_KEY=newrelic_key" \ # NewRelicのライセンスキー
-p 80:80 nownabe/rails_bench:2.2.0 # 2.1.5、2.2.0、2.2.0-jemallocのいずれか