研修でのISUCONレポート
実質初投稿になります。
はじめに
遡ること約1ヶ月前、会社の新人研修でISUCONの過去問を解きました。
https://github.com/isucon/isucon7-final
制限時間は7時間とかなり本戦より短かったですが自分なりに勉強になった部分と消化できてない部分があったのでそれなりにまとめていこうかと。
環境
今回Nodeかgolangかどっちで行こうか迷ってたんですが、同期がみんなgolangでいってたのでイキってNodeでやってみることにしました。すると隣に同志がいたので二人でチーム組んでやることに。
VMは実際のISUCON同様クラウド上に環境を構築したのですが、レギュレーションがこちら
まあみんな環境は同じなんでいいですけど、本当のISUCONの結果と張り合うようなスコアは期待できなさそうだなーとか思いながらgcpでポチポチ
スタート
何はともあれとりあえずベンチマーク走らせます。
Python選択 A君「3600だった」
Golang選択 B君「1200だった」
言語ごとのベンチ結果に差がありすぎる
ここで室内各所でざわめき。
じゃあNodeはってことで走らせたら
_人人人人人_
> 300 <
 ̄Y^Y^Y^Y ̄
もう笑っちゃいました。
でもwebsocket周りでめちゃくちゃwarning出てきます。逆にこのwarning直せば1000くらいには伸ばせるのかなとかチームメイトと話しながらコードリーディング。(一ヶ月前の出来事でwarningメッセージ忘れてしまいました。)
読んでてやっていこうと思ったことはざっと
- websocketの謎warningを潰す (どうせこれで2000にはなるやろー)
- NodeをV8 -> V12に (これで3000かなー)
- kdawes/node-bigintなるnpmをとっぱらってV10からプリミティブになったBigIntに (うーん3500)
- とにかく無駄なクエリが多かったので消したりjoinしたりしてワンクエリに (5000くらい)
- 時間があれば一部オンメモリでデータ保存させよう(優勝うぇーいwwwwwww)
今回はインフラのチューニングはだめとのお達しがあったのでこんなもんでしょう。
やっていくぞ
websocketのwarning解消に一時間位費やしましたが解決できませんでした。
connection張るところでおかしなことやってないかなーって探したり、socket通信でトラブってるならsocket.ioに変えて最悪ポーリングでつないでもらうように変えようとか試行錯誤したものの消せず。
この段階で残り4時間くらい。
時間も時間なんでwebsocket問題は諦めてNodeのバージョンをちゃちゃっと上げます。
V12がV8よりどれくらい速くなってるかまでは調べませんでしたがとりあえずLTSに持ち上げました。
ここで再度ベンチ
_人人人人人_
> 120 <
 ̄Y^Y^Y^Y ̄
なんで下がるん。
結果最後までこの原因も突き止められませんでした。うーん無能。
バージョン戻そうとも考えましたがもうこの時点ですでにグダグダだったので、洗い出した部分全部とりあえずやってしまおうってことになり次にプリミティブ型のBigIntに変えます。
ここでいくつだったか覚えてないですがほとんどスコア伸びなかったことだけ覚えてます。
フォーク元のrepoのstarが257とマイナーなパッケージだったので、プリミティブ型にすれば四則演算速度絶対速くなるだろうと自信を持ってただけにもうチームメイトと二人でやけくそです。
この時点で残り1時間くらい。
もうやけくそですよ、クエリ消しながらDBに格納する値をオンメモリに移行していきます。
最後にconsole.log全部消して終了。最終的に160でした。
完全に不完全燃焼です。何もしないほうがスコア高かった。何なら素のPythonに10倍以上負けているという。
結果発表
上位三名は全員Pythonでした。1位は30000超えてました。すごすぎ。
実はこのプログラム、解の公式を毎フレーム解いているのですが、(自分はここをチューニング対象から外してました)Python独自のLRUキャッシュを用いて高速化することで超上がったらしいです。Python以外選択しててもメモ化再帰してればLRUキャッシュ相当の速さ出せたのかもしれません。
Node選択者は僕ら以外にもう1人いたらしいですが同様散々だったらしいです。
感想
1. 柔軟な対応力が足りない
1位のチームはまず最初に提供されていた言語全てをベンチにかけて一番高い言語であるPythonにしたそうです。めっちゃ頭いいなと思いました。
こういう対応力ってコンテストでは非常に大事なスキルだなと思います。これからどんどんコンテストとか出ていきたいと思っているのでいい勉強になりました。
2. 楽しい
二人で会話しながらチューニング()していたからというのもあるかもしれませんが何より楽しかったです。今度ISUCONに参加したいです。(社会人になってしまったのが悔やまれる)
3. ボトルネックを探すのが下手
負けたのも悔しいですが、解の公式をチューニングするっていうところに目を全くつけられなかったのが何より悔しいです。毎フレーム解の公式解くって、言われてみれば超重いじゃんって。
以上研修ISUCONレポートでした。もうはるか昔で記憶から一部消えてしまっている部分もありましたが、これからはこういう場所でしっかり咀嚼していきたいですね。