もう2週間も前のことというのに驚きつつ、ISUCON8に出場して予選敗退した記録。来年に向けたメモ。
チーム編成
メンバーは2人で、両名とも「ふだんやらないことをやりたい」という動機で初参加した。
- @RyotaKatoh
- 機械学習エンジニア
- GoによるWebアプリも書ける
- Webアプリをチューニングするようなのは「ふだんやらないこと」なのでアプリのコード変更をやることに
- @ohbarye
- Webエンジニア
- Ruby on RailsによるWebアプリ、ReactなどによるSPAがメイン業務
- Golangやインフラまわりは「ふだんやらないこと」なのでh2oやmariadbを見ることに
- Golang力は、前日までにTour of Goを流し読みした程度
選択言語はGolang。
チーム名 sayotan
は参加できなかった第三のメンバー名から。
結果
さきに結果を書くとBest Score: 23,553で最終結果: fail (fail前 20,304) だった。
得点が跳ね上がってから不安定になったのは認識していたものの、最後のベンチマーカ実行で pass していたので再起動試験の結果が発表されるまで自分たちが fail で終わっているとは気づかなかった…。
経過
主に自分の視点で思い出しつつ書いてみる
- まずsshでつなぐ
- RyotaKatoh がtable schemaを出してくれた
- マシンのスペック(CPU, メモリ)確認したりした
- とりあえずベンチマーカ実行してみた
- どのぐらいかかるのかと思ったら1分強で終わった
top
- mysqldのほうが頑張っているなーと理解
ちゃんとボトルネックを特定しながらやっていくかーと思ったが計測ツールを調べてこなかった情弱ぶる
- ググりながらmysqlslowdumpを試す
- 一番時間かかっているやつ、一番ロックしているやつをつぶす
- indexいくつか増やしたがこの時点ではあまり影響なかった
- RyotaKatohはコードリーディングしてN+1に気付いたりしていたと思う
- デプロイの自動化はやらず、git pullで頑張ることにした
- 2人なので声かけながらやれば大丈夫そう
午前は得点への貢献が特になかった。
午後
- h2oの設定を見る
- 静的ファイルの配信はちゃんとh2oがやってくれていた
- access logをshellで整形
- 静的ファイルへのアクセスがあまりないのでここは頑張ってもしょうがないかなと理解
- reports系はそこそこだけど一発がおもそう
- データをメモリをロードしまくっているが削ったりはできなさそう
- for updateは要らなさそうなのでけずった
- RyotaKatohがget_eventのN+1を解消、SQL一発で解決するようにすることでscoreが跳ね上がり、20,000点を超えるようになる
- しかし性能があがるとテストケースが変わって(?)failするようになる
- 複数台構成を諦める
- 午前は複数台に挑戦するつもりだったが、1台で頑張れるところまで頑張れるかー、となった
- 戦略的にやったわけではないが、結果として/initの罠にはまらなくてよかった
- ログイン周りのアクセスが多かったのでsha2による暗号化とかを効率化しようとした
- しかしGolang力が足りず結局revert
感想
書き出してみると「8時間近くあったのにこれしかやってないの…?」感がすごい。また、基本的な予習がまったく足りていなかったことを終わってから後悔した。
逆に言えばきちんと対策をして基本的な計測ツールの使い方やボトルネックの特定のしかたを理解したり、戦略的な進行管理ができればもっといけたかもしれない、という希望も持てた。
また、自分が力を発揮できそうなWebアプリ周りを今回はほぼやらなかったのでその辺でどれぐらいできるかも試してみたくなった。
来年もふだんやらないことをやるために出場してみるか〜
余談
ISUCONの余波で弊社のレポジトリに "ISU" ラベルが増えた pic.twitter.com/PxrEWqLiS5
— 広島の粗大ゴミ (@ohbarye) September 28, 2018