Miscellaneous notes

主に技術的な雑記的な

ISUCON4予選問題をngx_mrubyだけで解いてみた(結果・気づいたこと・感想編)

この記事は、mod_mruby ngx_mruby Advent Calendar 2日目の記事になります。

「分かったこととか、ちょっとしたノウハウ(レベル低いやつですw)とか、感想とか」とエントリーしましたが、全部まとめて書くとエライ長くなりそうなのと、情報がまぜこぜになって読みづらくなりそうなので、幸いアドカレの枠にまだそれなりに空きがあるようですので分割させていただきますm(__)m

ここではまず、やってみて「分かったこと(というかやってて気づいたこと)」と「感想」の辺りを書きたいと思います。
ノウハウについては5日目に書こうと思います。

きっかけ

まず、常々出たいとは思っていたものの、相棒が居ないので出れなかったISUCONの予選問題が公開され、それを普段使っていた(現在はPythonの会社に転職したので過去形)PHPでやってみたりしてました。

isucon4予選AMIが公開されたのでPHPでやってみた(score:54491) | A Convenient Engineer's Note

その後、何気なくngx_mrubyのwikiを眺めていたら、Redisへのアクセスができたり、コンテンツ出力リダイレクトNginxの組み込み変数リクエストヘッダから値が取れたりと一通り必要なものが揃っていて、「アレ?これだけでもあの問題解けるんじゃね?そして、もしかして速いんじゃね?」ってなりました。

Home · matsumoto-r/ngx_mruby Wiki · GitHub

ということでまずは結果から

$ ./benchmarker bench --workload=4
15:30:38 type:info message:launch benchmarker
15:30:38 type:warning  message:Result not sent to server because API key is not set
15:30:38 type:info message:init environment
15:31:12 type:info message:run benchmark workload: 4
(snip)
15:32:12 type:info message:finish benchmark workload: 4
15:32:17 type:info message:check banned ips and locked users report
15:32:17 type:fail reason:invalid character '<' looking for beginning of value   message:Report checking is failed. Do not send score.
15:32:17 type:score    success:250385 fail:123   score:54086

benchmakerのチューニングや静的ファイルへのリクエストを減らす等はせず、正攻法だけでこの数字なので、かなり速いですね。

Nginxのworker_processesが1なので、これが増やせるともっとイケそうな気がするのですが、何故かworker_processesworkloadが共に2以上になると、どこかで詰まるらしく著しくスループットが落ちてしまいました…
どこで詰まっているか、調査の上ご報告できれば良いなと思います。

補足というか謝罪

ただ、すいません。いくつか謝罪しなければならないことがあります。

結果を見て気が付かれたかもしれませんが、バグが潰しきれずに微妙にFailが残っています。

あと、時間がなくてreportが実装できてません。
ただ、別で解いてみた感覚から言うと、出てるFailの種類的にたぶんreportは大丈夫なような…どうだろという感じです(^_^;)
作るとすれば、mrbgemsのredisはrubygemsのredisのようにデータをまとめて取得することはできない(READMEを読む限りは…という話でソースは読んで無いので実はできるかも)ようなので、ここは速度は求められないので普通にRubyで書いてプロキシするのが良いかと思います。

その他やってて気づいたこと

Nginx.redirectを呼ぶとresponse bodyにリダイレクトURLの繰り返しのようなものが入り、不正なレスポンスになってしまいます。
バグっぽい気がするのですが、Nginxの他のサードパーティモジュールを入れていたりもするので、もう少し切り分けてから報告したいと思います。

2014.12.16追記: このバグは修正されました。

Fix bug; response data includes location url when using redirect method · 45fc7ac · matsumoto-r/ngx_mruby · GitHub

matsumotoryさんの迅速な対応に感謝するとともに、
Issueも上げれず申し訳ありませんでした…

感想

導入方法や各メソッドの使い方など、wikiにかなり丁寧に書かれていて、非常にやりやすかったです。
ただ、基本的には「WEBサーバの機能拡張用途」がメインですので、それだけでWEBアプリケーションを書こうとするとそれなりにハマりどころや落とし穴もありました(その辺りのノウハウは5日目に書こうと思います)
ごくごくシンプルなアプリケーションであれば、「ngx_mrubyで書いて省リソースかつ高速に」というのもアリかもしれないというのが、やってみての感想になります。
もちろん、本来の用途であれば、この手軽さと柔軟さは非常に魅力的だと感じました。

あと、こっそりやっていたら、作者のmatsumotoryさんに補足されて、アドバイスをもらったり…なんてことがありました。
作者の方が日本人かつ良い人というのも大きな魅力の一つなのではないかと思います。

ソースコードや設定ファイルはコチラになります。とても雑な作りですが、ご参考までに。

marcy-terui/isu4qualifier_mruby · GitHub

とりあえず、あとは5日目にということで、以上です。

明日はhkusuさんのAmazon Linux 上の Apache2.4 に mod_mruby をインストールする手順になります。