ISUCON9予選に参加しました
昨年に引き続き、同じメンバーで今年もISUCONに参加しました!
結果はというと・・・またもや予選敗退。悔しい(´;ω;`)
最終スコアが 8,860 、本選参加のギリギリラインが 9,880 だったので、あともう一息?最後間に合わなかった対応もあったので、その辺も悔やまれる結果でした。
ただブログを書くまでがISUCONなので、対策としてやってきたことや当日の様子などを書いてきます。
準備したこと
Go言語の習得
昨年はGo言語を選択して予選参加したんですが、自分はそこまでGo言語に詳しくなかったので、今年はちゃんとGo言語を使いこなせる状態で参戦しようと決めてました。 なのでGo言語習得のためにいろいろやってました。
まず最初はチュートリアル。
一通りGo言語を理解できたので、その後はしばらく競技プログラミングで過去問やってました。
途中から、毎週水曜の昼休みに同僚と一緒に過去問をやるようになり、習慣化できたのが良かったです。
あとは年明けぐらいから業務でも使える場面も増えてきたので、積極的にGo言語でプロジェクト内のツールやスクリプトなどで採用していきました。
ISUCONの振り返り
過去のISUCONのGo言語実装を見返したり、他の方がどんな進め方で予選を通過したのかを、ブログなどを拝見して勉強してました。
当日の流れ
当日は昨年と同様、会社に集まって3人横並びで臨みました。 ただ昨年ほど準備万端でやれなかったため、思いつく限り話し合いながら作業を進めた感じです。
10:00 〜 12:00
- ガイドラインの熟読
- システム構成の把握
- 初期スコア確認
- もろもろをGit管理
- モニタリング実施/ボトルネック検出
- netdata
- pt-query-digest
- kataribe
- ローカルからリモートを操作するスクリプト準備
- アプリのデプロイ
- MySQL設定変更
- Nginx設定変更
12:00 〜 18:00
- pt-query-digestでわかったスロークエリを元に改善
- クエリ自体の改善
- インデックス見直し
- N+1問題になっていた実装を中心に修正
- マスター情報をメモリキャッシュ
- 気になるところを個別チューニング
12時以降はもうあっという間、個別最適した結果スコアが伸びてくれた感じでした。 昨年の方がもっと計画的に全体を進められた気がします。 その結果、本来サーバは3台構成までできるところを結局1台構成にとどまってしまいました。 せめてMySQLを別サーバに分離できていれば、もうちょっとスコアも伸びてくれてたと思うんですが・・・。
まとめ
というわけで私たちのISUCONは今年も終わりました。
反省点としては、やはり進め方をもう少し計画的に出来たら良かったなーというところです。 反面、手を入れたところはうまくスコアの伸びにつながってくれたので、無駄な作業もあまりなかったのが良かったかも! (実装面で変なとこに手こずって時間をロスしたところもありますが・・・)
昨年も楽しかったけど、今年も最高に楽しい一日でした! 今年はリクエスト数とかじゃなくて、本物のサービスのように売上金額がスコアになっていたのも斬新でした。 そのおかげか、スコアが変なばらつきもなく安定した結果が出てくれたので迷いなく改善を繰り返すことができました。 運営の皆様、本当にお疲れさまでした!! 本選も無事終わることをお祈りしております。