“Hello World”なベンチマークでUnicornに比べ2倍高速に動作するRackサーバをリリースしました。

rubygems: http://rubygems.org/gems/rhebok
github: https://github.com/kazeburo/rhebok

PerlのGazelleをベースに作っています。Rackアプリケーションの運用経験がほぼないので、機能不足があると思います。issue等で教えて頂ければ幸いです。

なぜ高速に動作するアプリケーションサーバが必要なのか

Unicornは高速に動作します。多くのアプリケーションにとっては十分でしょう。それでもRhebokでさらに上のパフォーマンスを出そうとしたのは、技術的なチャレンジの他に以下のようなアプリケーションで高速なアプリケーションサーバが必要とされると考えているからです。

  • ソーシャルゲーム、広告サーバ、SNSなど、高度に最適化が行われているサービス。1台のサーバで数百req/secを処理する
  • サーバコストに敏感な1PVあたりの利益が小さいサービス。効率のよいアプリケーションサーバによりサーバコストを下げられる可能性がある

同じ技術を用いて作られたGazelleは既にいくつかのサービスに投入され、CPU使用率を数%さげるなどの効果がありました。

ベンチマーク結果

nginxでReverse Proxyして、”Hello World”を返すベンチマークで約2倍のパフォーマンスを発揮します。

rhebok.png

ベンチマークはEC2上で行いました。32コアのc3.xlargeを使い、nginxのworker数を16、unicornとrhebokのworker数は8で起動し、wrkで500並列にて負荷を掛けました。現実とはかけ離れた環境となっているのは、unicornが高速に動作するので通常の環境ではなかなか差がでないためです。

ベンチマークの詳細はREADMEに書きました。

Rhebokの特徴と機能

Rhebokは以下のような特徴・機能をもっています

  • kazuhoさんのpicohttpparserを使った高速なHTTP処理
  • io処理をC拡張により実装
  • Linuxではaccept4(2)を使用
  • writevを使ったレスポンス出力
  • reverse proxyの背後に起動することを前提に、HTTP/1.0の機能のみをサポート
  • MaxRequestPerChild/MinRequestPerChildによる定期的なプロセス入れ替え
  • prefork_engineをつかったPreforkアーキテクチャ
  • start_serverを使用して、unix domain socketのlistenとhot deployが可能

PerlのStarlet、Gazelleといったサーバの移植なので同じオプションをサポートしています。詳しくはまた別の機会に紹介したいと思います。

ISUCON4 予選でUnicornをRhebokにしたときのスコア

sonotsさんがRaptorで試しているので、同じ事をRhebokでもチャレンジします。現実的なWebサービス環境でRhebokによるパフォーマンス向上がどの程度あるのか調べるのに、ISUCONの予選問題は適当な題材です。

ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術を参考に

  • mysqlのindex作成
  • my.cnfの変更
  • sysctl.confでポート数の拡大
  • nginxの設定

を行います。

まず、unicorn。

$ cat Procfile 
unicorn: bundle exec unicorn -E production -c unicorn_config.rb -l /dev/shm/app.sock
$ cat unicorn_config.rb 
worker_processes 4
preload_app true

プロセス数を10から4に下げています。

ベンチマーク結果

$ ~/benchmarker bench --workload 8
16:58:58 type:info      message:launch benchmarker
16:58:58 type:warning   message:Result not sent to server because API key is not set
16:58:58 type:info      message:init environment
16:59:07 type:info      message:run benchmark workload: 8
17:00:07 type:info      message:finish benchmark workload: 8
17:00:12 type:info      message:check banned ips and locked users report
17:00:13 type:report    count:banned ips        value:638
17:00:13 type:report    count:locked users      value:4468
17:00:14 type:info      message:Result not sent to server because API key is not set
17:00:14 type:score     success:193450  fail:0  score:41789

つぎに Rhebok

$ cat Procfile 
unicorn: bundle exec start_server --path /dev/shm/app.sock -- rackup -E production -s Rhebok -O MaxRequestPerChild=500000 -O MinRequestPerChild=400000 -O MaxWorkers=4 config.ru

unix domain socketを使用するためにstart_serverも使います

結果

$ ~/benchmarker bench --workload 8
16:57:05 type:info      message:launch benchmarker
16:57:05 type:warning   message:Result not sent to server because API key is not set
16:57:05 type:info      message:init environment
16:57:13 type:info      message:run benchmark workload: 8
16:58:13 type:info      message:finish benchmark workload: 8
16:58:18 type:info      message:check banned ips and locked users report
16:58:20 type:report    count:banned ips        value:748
16:58:20 type:report    count:locked users      value:4581
16:58:20 type:info      message:Result not sent to server because API key is not set
16:58:20 type:score     success:203370  fail:0  score:43933

Unicornと比べ、2000程度のスコアが上昇し、Rhebokに変更することで一定の効果があるということがわかりました。

ぜひ、使ってみてくださいませ!

このブログ記事について

このページは、Masahiro Naganoが2014年12月19日 12:14に書いたブログ記事です。

ひとつ前のブログ記事は「Gazelle: new Simple and Fast Plack Handler for Performance Freaks」です。

次のブログ記事は「「Webエンジニアが知っておきたいインフラの基本」はぜひこの冬休みにWebエンジニア・ディレクタに読んでみて欲しい一冊」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja