さてさて、ついにこの日がやってきました。
mrubyが出てから、はや5日がたとうとしています。様子を見ていると、名前がmatsumotoという人達がmrubyを弄る確率が高いようです。僕も名前がmatsumotoなので、当然弄っています。こちら(Getting Started With Mruby)に関連する情報がまとまっています。
もともと、mod_mrubyを作る事になったモチベーションとしては、mod_mrubyを作ってみようかで書いていますが、様々な分野でLuaと呼ばれる軽量スクリプトの人気が高まってきており、それに対抗するべく、組み込みにあった軽量rubyとしてmrubyがリリースされました。それと同時に、僕のミッションとしては、やはりmod_luaだけじゃなく、そのかわりとしてmrubyも使えるんだと証明するべく、先日からmod_mrubyの開発にとりかかりました。
ベンチマーク比較のための環境設定
現状、モジュール型でスクリプト実行が可能な状態までmod_mrubyを実装できたので、早速、mod_mrubyとmod_luaのベンチマーク比較を行いました。当然、環境はApache2.4のprefork上です。(event_mpmはずーっと負荷かけていくと、後の方がうんともすんともいかなくなったので、原因は調べるとして今回は採用しませんでした。)
では、早速mod_mrubyとmod_luaをコンパイルして、以下のように組み込みました。
- mod_mrubyの設定
LoadModule mruby_module modules/mod_mruby.so
AddHandler mruby-script .mrb
- mod_luaの設定
Loadmodule lua_module modules/mod_lua.so
AddHandler lua-script .lua
aそして、それぞれのベンチスクリプトは、シンプルに以下のようにしました。
- mrubyスクリプト
require 'Apache'
Apache.rputs("hello world!")
- luaスクリプト
require "apache2"
function handle(r)
r:puts("hello world!")
end
mod_luaはApacheから呼び出される際には、handleファンクションを見に行くような実装になっているので、上記のようにしました。
ベンチマーク結果
では、以下のパラメータでベンチマークをとります。環境は、Apache 2.4.1のスループット評価(旧ApacheとNginxとのベンチマーク比較)の時と同じになります。今回は、前回のスループットではなく、純粋にどの程度の速度で処理が可能なのかを知るために、それぞれがある程度余裕をもって処理できるパラメータを見つけて、複数回ベンチマークをとってみました。
以下のようなabコマンドでrequest per sec(1秒間に処理できたリクエスト数)を10回分比較しました。同時接続数200で総接続数は5000です。
ab -c 200 -n 5000 http://ipaddr/hello.lua | grep "Requests per second"
ab -c 200 -n 5000 http://ipaddr/hello.mrb | grep "Requests per second"
それでは、mod_mruby vs mod_luaの結果はどうなったのでしょうか!
はい、結果は以下のようになりました。
残念ながら、mod_luaはとんでもなく早くて、mod_mrubyの3倍程度の処理性能がありました。さすがに、スクリプト言語界で最速というのは過言ではありませんね。参考までにmod_phpで同じようにhello worldをechoするスクリプトのベンチマークも計測しました。確かにmrubyはphpよりはだいぶ早いのですが、Luaよりはまだまだ遅いようです。もちろん、mod_mrubyの実装に問題があるのかもしれませんので、そこは調査してみます。
また、別の実験で同時接続数や総接続数を増やしていくと、mod_luaが処理できる領域でも、mod_mrubyは処理が追いつかなくなり、処理が沢山キューイングされてしまって、「scoreboard is full, not at MaxRequestWorkers」や「(24)Too many open files: AH02179: apr_socket_accept: (client socket)」のエラーが出始め、最終的にはmod_mrubyでファイルハンドルが開けない時のエラーである「mod_mruby ERROR ap_mruby_run: mrb file oepn failed: /usr/local/apache2.4/htdocs/hello.mrb」が頻発されました。
現状では、Luaの方がかなり早いと思われます。しかし、Luaはオブジェクト指向を明確にサポートしていないが、一応はオブジェクト指向っぽく書くことができる一方で、mrubyはオブジェクト指向言語であるmrubyはLuaのようななんちゃってオブジェクト指向ではなく、本当のオブジェクト指向で実装できるので、そういう点で抽象度が高く書きやすい所に強みがあるんじゃないかと思います。
まつもとゆきひろさんが言うには、
JavaScriptと同じで、Luaのオブジェクト指向は内臓が見えちゃっているような感じ
だそうです。(参考:ついに軽量Rubyの「mruby」のソースコードが公開!の動画)
とりあえずは、mrubyが速くなる事に期待して、mod_mrubyの開発を続けようと思います。
Is mod_mruby similar to mod_ruby? What is the difference?
main purpose of mod_ruby is using ruby program as web contents , but mod_mruby is to provide an alternative to mod_lua.
gitに入っているソースは、Apache 2.2 向けなんですね。
2.4 でコンパイルしたら r->server->loglevel が未定義と出て戸惑ってしまいました。
>> uguyaさん
ご指摘ありがとうございます。
早速、2.4でも使えるようにMakefileとソースを弄りました。
Makefileに2.4用のapxsとhttpdを指定して頂き、DEF=-D__APACHE24__のコメントを外していただくとコンパイルが通るとおもいます。