ngx_mrubyとmod_mrubyのパフォーマンス比較してみた

ngx_mrubyに対しても、mod_mrubyで実装していたような高速化アーキテクチャ(これとかこれ)を実装することができたので、どれくらいのパフォーマンスがでるのかをngx_mrubymod_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秒間に処理できるリクエスト数を測定しました。検証環境はいつもと同じです。

experiment_hw

同時接続数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がチューニング次第では高速だった記事をここに置いていきます。