mod_mrubyをevent及びworker MPM(マルチスレッドモデル)に対応させた

mod_mrubyを、event MPMやworker MPMといったマルチスレッド型のMPMに対応させました。

これで、安心してApache2.4でのevent MPMでmod_mrubyが使えるようになります。

スレッドセーフに対応したきっかけ

そろそろ来月はアメリカのポートランドで開かれるApacheCon NA 2013だし、mod_mrubyのことをApacheの開発MLに投げとこうと思って、mod_mruby良い感じだよとメールを送ってみました。

すると、Apache HTTP ServerやTraffice Serverの中の人でもあり、mod_luaの中の人でもあるDanielが反応してくれました。一連の流れをかなり要約すると以下のようになります。

やぁ、松本

mod_mrubyすごい面白そうだね。ベンチマーク結果もRubyって遅いはずなのにすごい早いじゃん。なんで?スライドとかブログを英語で書いてよ。それみて勉強するからさ。

ところで、preforkだと動くんだけど、workerやevent MPMじゃsegfault起こして落ちちゃうよ?スレッドセーフじゃないの?これからApache2.4とか2.5使う人は大概それらのスレッド型のMPMを使うだろうから、そっちをサポートして欲しいなぁ。

もしそれができたら、mod_luaと共存しつつ代替手段としてApache HTTP Serverに取り込むのも歓迎だよ。

ついでにApacheCon NAでmod_luaのこと話すから、ついでにmod_mrubyのことも話しておくよ。もし見に来てくれたら、Lua JIT版のmod_luaがいかに爆速か見せてあげるよ!

それにしても、ApacheConまでにスレッドセーフにしてくれないかなぁ、早くベンチマークとって比較したいぜ!

ダニエル

という事になったのです。これを見て、「うおおおー、スレッドセーフ化やるしか無い!」と思い、昨日の夜急遽突発で一人ハッカソンを行なって、mod_mrubyのスレッドセーフ化の実装をしました

Windowsに関しては、毎度お世話になっているmattnさんから以下のようなお言葉を頂いていたので、何も心配はしていませんでした。


 

MPM毎のベンチマーク

ということで、いつも通りApache2.4のprefork、worker、event MPMに対して、同時接続数100総接続数10万のベンチをabで行いました。

リクエスト対象は、静的ファイル、confに直接コードを書いておいてそれを実行するコードフック型と、スクリプトファイルをリクエスト毎に読み込んで実行するファイルフック型を試しました。内容は単純なhello worldを表示するだけのものです。

以下がそのベンチ結果です。値はリクエスト/秒です。

index.html(静的ファイル) mod_mruby(コードフック型) mod_mruby(ファイルフック型)
prefork 11158.17 14578.28 10289.92
worker 11202.73 12618.27 11173.08
event 18564.42 18618.67 13451.18

やはり、event MPMは早いですねー。mod_mrubyでの相性も抜群そうです。

一応、参考までにApacheのconfを貼っておきます。

  • httpd.conf

[program lang=’apache’ escaped=’true’]

# mod_mrubyの設定
LoadModule mruby_module       modules/mod_mruby.so
Addhandler mruby-script .mrb
<Location /mruby>
    sethandler mruby-native-script
    mrubyHandlerCode "Apache.rputs 'hello mod_mruby world'"
</Location>

# MPMの設定、ほとんどデフォルト
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

<IfModule mpm_event_module>
    StartServers 4
    MinSpareThreads 4
    MaxSpareThreads 4
    ThreadsPerChild 2
    MaxRequestWorkers 2
    MaxConnectionsPerChild 0
</IfModule>

[/program]

  • hello.mrb

[program lang=’ruby’ escaped=’true’]

Apache.rputs("hello mruby world!!")

[/program]

最後に

というわけで、mod_mrubyを今後Apache2.4や2.5を使っていく人でも、MPMを気にせず使えるようになりました。

これからももっとmod_mrubyの使い勝手を良くして行きたいと思います。

それにしても、もしApache HTTP Serverに取り込まれたらうれしいなぁ。