isucon4予選問題をOpenResty使ってlua実装

isucon4の予選問題をnginx+lua+redisな構成で作ってみました。
モチベーションとしては、lua+nginxのパフォーマンスの可能性見てみたかったのと、
シンプルなアプリケーションなのでlua練習にいいのでは、というところでした。

コーディング

@sora_h さんの解答 redis編を参考にluaに書き直してみました。
https://github.com/sorah/isucon4-qualifier-sorah

コードはこちら、
https://github.com/karahiyo/isucon4-qualifier_luajit-nginx-redis

OpenResty( http://openresty.org/ )を選択

他に、以下のモジュール・ライブラリを使いました。

ベンチマーク

ベンチマークをとってみます。8並列で。

$ ./benchmarker b --workload 8 --init ~/isucon4-qualifier_luajit-nginx-redis/bench/init.sh --host localhost:8080
...
19:52:14 type:info      message:finish benchmark workload: 8
19:52:19 type:info      message:check banned ips and locked users report
19:52:21 type:report    count:banned ips        value:1024
19:52:21 type:report    count:locked users      value:4995
19:52:22 type:info      message:Result not sent to server because API key is not set
19:52:22 type:score     success:245410  fail:356        score:53013

性能的には悪くはなさそうです。まだ静的ファイル削るなどの改善の余地もあるので。

ただ、本当に残念ながらまだfailが出ています。。。
どんなfailが起きているかというと、/loginにPOST、失敗したあとの/へリダイレクトされたあと、noticeメッセージの内容が期待したものと違っているというものです。
レポート自体は合っているということで、今回はご容赦>_<

雑感

やってみた感想としては、openresty便利だなぁと。得に環境構築の面で。

lua + nginx としては、
アプリケーション層の手前で何かしたい場合1手段として有望そう(例えば、おれおれロードバランサ)、APIサービスつくるには向いていそう(?)、しかしwebサービスをつくるには向いていなさそう(?)、という感想です。

  • パフォーマンスはよさそう
  • luaの文法シンプル◯
  • なんだかいろいろつらみがあった
    • いつもの感じでDRYに書こうと思ったら、https://github.com/openresty/lua-resty-redisedis/issues/44 にハマった
    • セッション管理の難しさ
    • 実際にproductionでopenresty等使う際には、リバースプロキシとしてのnginxとwebサービスのためのnginxは分けたほうが良さそう
    • というのも、もしリバースプロキシとしてのnginxとサービス提供のnginxが同じだった場合、
      • => webサービスのnginxの初期化処理がコケたために、リバースプロキシとしてのnginxが起動できない可能性
      • webサービスのためのnginxでは、`init_by_lua`や`init_worker_by_lua`でサービスのための初期化をしうる

改善の余地ありまくりのコードを書いたレベルなのであくまで今の1感想ですmm
また時がきたら触ってみたいです。

© karahiyo