2020-10-11

ISUCON10 本選8位でした #isucon

概要

10月3日にISUCON10 本選にチーム名 hidekiy、チームメンバー @hidekiy, @kotaroy で参加して、結果8位でした。賞金圏内は逃しましたが、過去の本選出場時のやられっぷりに比べて、若干の進歩は感じました。

何をやったかメモ

10:00

レギュレーション、アプリ仕様確認
盛り沢山過ぎて過去の ISUCON 本選でほぼ何もできなかった悪夢が蘇って焦る。

11:00

アプリのコード確認、やはりボリューム感が凄くて気分が悪くなる。
予選と同じく Cloud Profiler, Cloud Trace 設定する。サーバー1号機がメモリ不足でアプリのビルドが遅すぎるので、仕方なくスペックが少し良さそうな2号機に移行したら行けた。

12:00

ホームディレクトリに作った Makefile から、make -C webapp/golang としていたら明後日の場所 ~/bin にバイナリが出来ていてデプロイ出来ていない事に気づく。(cd webapp/golang && make) として対処完了

13:00

ListNotifications の負荷が高いため、Web Push に移行する対応を行う。サンプルコードのおかげて特に難しい事は無く出来た。

14:00

Audience Dashboard はユーザーごとに変化させなくて良く、一律でキャッシュ可能なので、singleflight で一定時間内(1秒間)に来たユーザーには同じレスポンスを返しておく対応をする。シリアライズ後のバイナリを作るところまでを共通処理とした。

15:00

Leaderboard を対処するため、クエリ側からユーザー固有パラメーターを抜いて、ジョブ履歴とチーム一覧を全ユーザー共通で取得出来るようにし、ユーザー固有の調整(スコアフリーズ中のスコアなど)は後でアプリ側で行うことで、Audience Dashboard と同様にキャッシュ可能にする

16:00

ListNotifications で使っている loginRequired の負荷が高いので調べたところ、必ずしも getCurrentTeam しなくとも、contestant.TeamID が入っている事で判断出来るようなので修正

17:00

ListClarifications も同様に、全ユーザー共通でDBクエリ結果のキャッシュを、アプリ側でユーザー固有のフィルタをしようと修正したが、ベンチマーカーの不整合検知を解決できず元に戻す。
チームキャパシティを増やすとエラーが出て動かなくなるが、よう分からんので大丈夫な所まで減らして回避 (Envoy の Too many open files だった模様)。この影響により再起動しないと調子が悪くなる状態になり大変困る。再起動すれば動くであろう状態にして競技時間終了

反省点

  • インフラ
    • 3台の CPU コア数、メモリ容量がどうなってるか良く分かっていなかった。
    • 最後まで2号機のみを使っていて、複数台構成に出来ていなかった。
    • Envoy のトラブルシュートと設定修正が出来ていなかった。
  • アプリ
    • singleflight だけ使うんじゃなくて cache + singleflight が良かったかもしんない。
    • ベンチマーカー側のアプリのロックなどを改良出来ていなかった。
スコアフリーズ後の最終リーダーボードに、1時間ほど2位で載っていたのは嬉しかったです🤣

謝辞

いつも ISUCON を通して、何も出来なくて負けるのがとても悔しいから、日々精進するという貴重な機会を頂いていると思います。
運営の方々には、このような素晴らしいコンテストを開催いただき大変感謝しています。