ngx_mrubyに対しても、mod_mrubyで実装していたような高速化アーキテクチャ(これとかこれ)を実装することができたので、どれくらいのパフォーマンスがでるのかをngx_mrubyとmod_mrubyで比較してみました。
mod_mrubyとngx_mrubyのインストール
gitからそれぞれのコードを落としてきて、以下のようにコンパイルしました。
mod_mruby
[program lang=’bash’ escaped=’true’]
git clone git://github.com/matsumoto-r/mod_mruby.git cd mod_mruby git submodule init git submodule update cd mruby git checkout master rake cd .. ./configure make sudo make install
[/program]
ngx_mruby
[program lang=’bash’ escaped=’true’]
git clone git://github.com/matsumoto-r/ngx_mruby.git cd ngx_mruby git submodule init git submodule update cd mruby git checkout master rake cd .. ./configure --with-ngx-src-root=/usr/local/src/nginx-1.2.2 --with-ngx-config-opt="--prefix=/usr/local/nginx" make sudo make install
[/program]
以上のようなコマンドでインストールしました。簡単ですね!
設定
それぞれ、confにmrubyを書くインライン機能に対応しているので以下のように設定を書きました。
mod_mruby
[program lang=’apache’ escaped=’true’]
<IfModule prefork.c> StartServers 40 MinSpareServers 40 MaxSpareServers 40 ServerLimit 40 MaxClients 40 MaxRequestsPerChild 0 </IfModule> LoadModule mruby_module modules/mod_mruby.so <Location /mruby> SetHandler mruby-native-script mrubyhandlercode "Apache.rputs 'hello mod_mruby world!'; Apache.return Apache::HTTP_OK;" </Location>
[/program]
ngx_mruby
[program lang=’apache’ escaped=’true’]
worker_processes 4; events { worker_connections 1024; } location /mruby { mruby_content_handler_code ' Nginx.rputs "hello ngx_mruby world!" Nginx.return Nginx::NGX_HTTP_OK '; }
[/program]
これで、それなりのチューニングになっているでしょう。同時接続数が100だからといって、プロセス数を100にしたりしないのが重要なポイントです。コンテキストスイッチはできるだけ少なくすることも忘れないようにしましょう。詳細は以前の記事を参考にして下さい。
パフォーマンス比較
ではこれらに対して、以下のようなabコマンドで1秒間に処理できるリクエスト数を測定しました。検証環境はいつもと同じです。
同時接続数100総接続数10万で負荷をかけました。
[program lang=’bash’ escaped=’true’]
ab -k -c 100 -n 100000 http://example.jp/mruby
[/program]
すると以下のような結果になりました。
mod_mruby | ngx_mruby | |
Requests per second[#/sec] | 21964.87 | 50636.63 |
Time per request[ms] | 4.546 | 1.945 |
ごっ5万超えだと!?ヒィっ、ngx_mruby早い!
最後に
以上のように、ngx_mrubyとmod_mrubyには大きなパフォーマンスの差が出てしまいました。といっても、これはnginxとApacheの差かもしれません。という意味ではngx_mrubyとmod_mrubyは各ソフトウェアの性能を最大限に活かせている(モジュールがボトルネックになっていないという意味では)と言えるかもしれません。
ただ、ApacheのeventMPMに対応させることで、mod_mrubyはもっと高速になるかもしれないので、そのあたりも実装継続していきたいと思います。参考までにeventMPMがチューニング次第では高速だった記事をここに置いていきます。