ISUCON13参戦記
はじめに
junki555とvtryoと共に「元同僚_最新_最終版コピー(2)_old決定版.xlsx」というチームでISUCON13に参加してきました。去年に続き2回目の参加です。
去年の結果(と雰囲気)
去年分はブログを書いていないため、チームメンバーのブログを参照。
言語はRuby/Go(Rubyでやり始めたものの、最後まであまりスコア上げれなかったので少しでも実行速度が早そうなGoに切り替えてフィニッシュ)。
最終スコアは3160でした。
今年の結果
今年は「とにかく1万点越えようぜ」という目標で参加。
言語はGo。スコア3500くらいからスタートして10500くらいでフィニッシュしました。
役割分担
- JUNKI555、自分
- アプリケーションコード
- DBスキーマ(主にインデックス追加)
- VTRyo
- インフラまわり
- Webサーバログやスロークエリの集計とSlack通知
という感じで分担しました。
自分の成果
alpの出力を見ながら GET /api/user/:username/statistics
が遅いねーということになり、getUserStatisticsHandlerのN+1をつぶしました。
整合性チェックを通すまでに試合時間のうち半分くらいかかりました。スコアは2000くらい上がったと思います(たしか)。
実質自分ができたのは上記だけで、次にアイコン画像ハッシュのキャッシュの仕組みを作ろうとしたのですが、カラムを追加したところ色んなところに影響が出たため断念(そもそもRedisとか使った方が良さそうなんですが、そういう導入を練習でしていないので手を出しませんでした)。
そして別の箇所のN+1をつぶそうとしたところで時間が近づいたのでこちらも断念。
感じた課題
スコープを自分ひとりに絞った課題ですが、とにかく実装が遅かったことが反省点です。普段Goを書かないのでISUCON以前の部分でハマりました。例えばsqlxの使い方で、 getContext
は単一レコードのマッピングに使えて selectContext
は複数レコードのマッピングに使えるとか、マッピングのためのStructには db:"column_name"
のような構造体タグを書く必要があるとか、エラーを出して調べてキャッチアップしていため時間が溶けてしまいました。
完全に予見可能なことではあったのですがやはり使用言語を使ったある程度の練習は必須であると感じました。あとここ数年DynamoDBの案件に関わっていたため、JOINやサブクエリなど組むにあたりSQL筋が相当弱くなっていることも実装の足を引っ張りました。
また、コード変更→整合性チェックのサイクルに都度時間がかかりすぎてしまうという課題もありました。今回はローカル開発環境を作らないという意思決定をし、コードを変更するたびにBenchを回していました。Bench自体の実行時間+待ち時間に加え、3人でBenchの取り合いになってしまいなかなか効率的に開発ができませんでした。
次回に向けて
Go言語の練習は当然として、コード変更→整合性チェックを高速に回せるようにしたいです。ローカル開発環境構築に手を出すべきか・・・ハマって時間を溶かすリスクがあり悩ましいです。
どこかで bench --pretest-only
で整合性チェックだけできるみたいな話を見たので、それもチェックしてみようと思っています。
おわりに
シンプルに楽しかったです。目標としていた1万点を超えられたのでひとまず満足できました。また来年も参加したいです。
Discussion