なんか皆さんエントリを書いていたので今更ながら釣られて書いてみます(集団心理の勝利)
※内容的には散々だったので参考になるようなことはありません. 来年リベンジする際に個人的に役立てたい(願望)
なんとなくISUCON気になるなぁと呟いていた所, @uadachiさんにお誘いいただき, @haya14busaさんと3人で Some(null) として出ることになりました. 完全にfunctional programing in scala 大阪読書会のメンバー. ちなみにSome(null)は大嫌いです(scala勢的なアレ)
準備
出場が決まってからあまり日程がなく, 割と直前が忙しかったこともあり, 準備という準備はできませんでした. 過去問を解くという発想もなく, 「ISUCONの勝ち方」のようなエントリを流し見をしたり, mysqlを調べた程度. この時点でかなり雲行きが怪しい.
予選本番
開始
開始が遅れる中, Node.jsの実装はありません を大変そうだなーと人事のように思いながら待ち構えていた所, Scalaの実装は不完全です にまず絶望する.
技術的に自分にできるようなことは少ないので, せめても力になれそうなDB周りをやることに.
なにをともあれでとりあえずベンチマークを走らせる → 何故か通ってスコアが出る. 直後にrubyの実装を動かしていたことが発覚しましたデスヨネー. 改めてscalaの実装で動かして比較した所, 表記やリンクがなにかおかしく, ベンチマークも通らない. バグ取りから始まりました. 並行して他の二人がローカルでの実行環境を整えることに.
「scalaでweb…どうせplayだろ?」と構えていた所, まさかのskinny. とはいえ本質的にはあまり関係なかったです. 結論から言うと, templateの変数埋め込みがちょこっとおかしかっただけでした, めでたしめでたし.
中盤
DBのダンプを取ることになったらしく, ローカルでの実行はしばらく足止めを食らう. 後になんとか起動にこぎつけた. 後から考えると, 開発用インスタンス建てたほうが早かったですネ.
バグを取ったことでベンチマークは通るようになったがチョー遅い. ので, てきとうにスロークエリを調べる. 更にpt-query-digestとやらを使って統計を取る. /
でどうみてもアレなクエリが大量に吐かれてる事がわかる. @uadachiさんがnginx辺りを, @haya14busaさんがisFriend
やらのN+1をやっていたので, 自分はスロークエリから見つけたやたらでかいjoin箇所をなんとかしようとしてました. 他で使っている箇所がなかったので力技で非正規化をすることに.
終盤
スキーマ変更やインデックスの貼り直しで意外と時間がかかったもののなんとか実装. digestを見ていた限り, それなりのボトルネックになっていた部分なのでスコアアガルヤローとか思っていたらベンチマークの並列テスト(?)やらでコケる. いろいろ試したものの, エラーの詳細も分からずこの実装はボツに(チーン)
その他, 他の二人がuserをキャッシュさせたり, N+1を解決したりといろいろしていったもののスコア上がらず. そのまま予選終了してしまいました (俺バグ取りくらいしかやってなくね?気のせい?)
反省とか
ちゃんと準備してから望みましょう(当然)
- 感覚をつかむためにも, 過去問やる時間が欲しかったですね.
- ハングアウトで通話しながらやってたんですが, 実際に集まるべきでした. 多分効率が全然違う.
- 普段の開発じゃないので, 保守性を一切捨てたほうが良かったです. 普段じゃ絶対タブーな手法でもどんどん使おう.
@uadachiさん, @haya14busaさんありがとうございました.
使ってたツール等
これだけ書いておけば, 来年の俺がきっと思い出して良いスコアを出してくれるはず…!!scalaで初予選抜けするぞっ