2016-10-27

ISUCON6 本戦敗退しました #isucon

22日土曜は第6回の ISUCON に参加しました。当日は無事起床は成功したのですが、完全に打ちのめされました。チーム名は円山町です。参加メンバーは会社の同期 @k_enoki, @ymz_kotaro です。今後のため当日やったことをメモしておきます。

10時~12時
4コア * 5台の構成が Azure のデフォルトのコア数制限にひっかかってデプロイ失敗、運営で2コア * 5台に変更していただき、この構成で競技することになる。
デプロイ後なぜかログインできないと思ったらユーザー名が自分の名前で入ろうとしていた。isucon@ としてログインに成功する。
バックエンド側アプリを Go 実装に変更後、何もいじらずにベンチ流してみるが、フロント側アプリの Node.js でアクセスログが出ていないのでアクセス状況は良く分からず。

12時~14時
Go のアプリのプロファイルを取得するためにアプリを改造する。Node.js 部分は @ymz_kotaro に依頼する。
@k_enoki が Node.js の前に nginx を立ててアクセスログを解析する。
isu05 に MySQL と Redis を立ててもらうのを @k_enoki に依頼する。
本番環境では別ノードの MySQL を使いたいが、ちゃんとした設定が良く分からないのでひとまずホストネットワーク設定とする。
docker-compose の扱い方でローカル環境構築に手こずったが、Docker for Mac ではホストネットワークが使えない問題があることが分かったので本番でのみ使うこととする。

14時~16時
docker-compose build していなくてイメージがリビルドされずコードの変更が反映されない問題を解決する。
Go のプロファイル上最も時間を費やしていた、あるルームの全情報を取得する API を Redis でキャッシュする機能を作成する。
ポーリングで沢山無駄にクエリを発行している、SSE で部屋の更新情報を通知してくれる API を Redis の Pub Sub を使って改造することを計画する。

16時~18時
Redis のキャッシュ機構はバグ修正を git pull してようやく機能するようになる。
更新情報通知用の Pub Sub 機構は作ってみるがいつまでも FAIL が解決できない。
nginx で TLS 終端した後、Node.js へも TLS で接続しているのはもったいないので、Node.js 側のTLSを外す改造を @ymz_kotaro にやってもらう。

全体の感想
懇親会でも聞いた通り、予選では簡単だったアプリのデプロイも、本戦ではちゃんと考えないとあっさり失敗するということを身をもって体感しました。
初めて本戦会場に来て、ただ素晴らしいネームカードを受け取っただけで、すでにいい気分になっていて、実際に勝つことをイメージして行動出来ていなかったと思います。
問題を理解して、やるべき事を速く確実にこなす、トラブルシュートを的確に行う、ということがそもそも出来ていなくて、力を発揮できる状況まで持って行けず負けたという感じでした。
自分がてんやわんやな状況になっている間も、問題を着実に解いている上位チームの圧倒的な力を感じます。
素晴らしいイベントを開催いただいた運営の皆様、ならびに問題作成者の皆様にとても感謝しています。