CombConfの発表が2日後に迫っているにも関わらず他の技術に手がでます。
組み込み向けのRubyであるmrubyをApacheに組み込めるようにした、mod_mrubyというものをFreeBSDで動かしてみようかと思って手を出したら大苦戦しました。
とりあえず動いたには動いたという状況ですが、簡単なメモとベンチマークを取ってみました。
2013/2/17追記
mod_mrubyの更新によって手順が変わりました⇒ mod_mruby on FreeBSD
導入はmod_mrubyのページと同じようにやればいいのかと思いきや、makeでエラーを吐いてしまいます。
$ make make: illegal option -- - usage: make [-BPSXeiknpqrstv] [-C directory] [-D variable] [-d flags] [-E variable] [-f makefile] [-I directory] [-j max_jobs] [-m directory] [-V variable] [variable=value] [target ...] rake aborted! Command failed with status (2): [make -C src --no-print-directory CC='gcc' ...] Tasks: TOP => default => all (See full trace by running task with --trace) *** [libmruby.a] Error code 1 Stop in /root/mod_mruby.
どうもmrubyのRakefileがLinux向けのようで、makeをgmakeに書き換える必要があるようです。
$ nano tmp/mruby/Rakefile #MAKE = ENV['MAKE'] || 'make' MAKE = ENV['MAKE'] || 'gmake'
mrubyは1回mod_mrubyをmakeをしないとRakefileが存在しないので注意です。
あとはWarningが出ますがとりあえずスルーして、make installすればApacheにモジュールが登録されます。
あとはhttpd.confに、
AddHandler mruby-script .mrb
と書き加えれば普通にmrubyファイルが動くはずなのですが……
自分の環境(Freebsd 9.1-BETA1 amd64, Apache/2.2.23 Event MPM)な環境では、httpdを起動した直後からCPUをバカ食いする上、リクエストに全く応答しなくなるという状況に陥ってしまい、解決策が分からなくなりました。
そんなことをTwitterで呟いたら、mod_mrubyの作者である、matsumoto-rさんから
@kyonfuee 現状、きちんと対応しているのはpreformでworkerもeventも一応動くのですが、不安定です。preforkで試してもだめでしょうか?
— Ryosuke Matsumoto / まつもとりー (@matsumotory) December 21, 2012
という指摘を頂きました。試しに(FreeBSD 9.0 i386, Apache/2.2.22 Prefork MPM)な旧サーバーで試したところ、何も問題がないかのように動きました。
どうもApache 2.2でEvent MPMをやるのはだめみたい……?
試しにどのくらい速いのか、mruby, FastCGIのRuby(mod_fcgid, 1.9.3p125), 静的ファイルの3つで比較してみました。
$ cat test.mrb Apache.rputs("Hello") Apache.return(Apache::OK) #!/usr/local/bin/ruby $ cat test.rb print "Content-type: text/plainnn" print "Hello!" $ cat test.txt Hello!
検証機のスペック: IBM ThinkCentre 8086-AGJ
CPU: Celeron D 330 2.66GHz
RAM: DDR-SDRAM 1GB
LAN: Gigabit Ethernet(Intel chip)
abの条件は下記の通り
$ ab -n 100000 -c 100
結果:
- mruby
Time taken for tests: 108.551 seconds
Requests per second: 921.23 [#/sec] (mean)
Time per request: 108.551 [ms] (mean)
Time per request: 1.086 [ms] (mean, across all concurrent requests)
- Ruby(FastCGI)
Time taken for tests: 362.996 seconds
Failed requests: 109
Requests per second: 275.48 [#/sec] (mean)
Time per request: 362.996 [ms] (mean)
Time per request: 3.630 [ms] (mean, across all concurrent requests)
- txt
Time taken for tests: 98.767 seconds
Requests per second: 1012.48 [#/sec] (mean)
Time per request: 98.767 [ms] (mean)
Time per request: 0.988 [ms] (mean, across all concurrent requests)
なんとmrubyが静的ファイルに迫る速度を出してました。すごい……
ちなみにmrubyが動かなかった方のメインサーバー(Core2 duo E6300@1.86Ghz, RAM512MB)ではRuby(FastCGI: mod_fcgid)で1857.93 [#/sec]とかいう値を叩きだしてました。
後日メインのサーバーの方もPreforkにして検証してみようかと思います。
いつになったらFreeBSD PortsにApache 2.4が来るのだろう……
そういえば、もう明後日に迫っていますが、CombConfに参加します!
内容は、「HTTPSを使わずに暗号化通信をしよう」でやる予定です。
出来るの………?(まだ検証してない