ISUCON10参加記

ISUCON10に garasubo さんと GolDDranks さんとチーム「勉強不足の分は有り余る才能でカバーでカバーしようかなと思っております」で参加して予選通過しました。チーム名がtypoしているのですが、一度登録すると修正できない仕様なので、カバーでカバーするしかない。

今回は完全オンラインでボイスチャットも使っておらず、全てログが残っていたので、時系列でまとめてみようと思います。

前日まで

使用言語をRustにすることでチームが決まりました。ISUCON9を使って2回くらい練習しましたが、ISUCON9まではRust参考実装がないので、ひたすら移植ゲーになりました。移植ゲーの中でactix-webの使い方を覚え、ついでにnginxとalpの使い方も覚えました。練習を通して、サーバー上でRustアプリケーションをコンパイルするのではなく、ローカルでコンパイルした実行可能ファイルをrsyncでサーバーに転送するデプロイ方法が確立されました。

当日

10:00-

開始が後ろ倒しになり、せっかく空いたので直前に何か準備しようと思いつつ Splatoon を始めたら一瞬で開始時刻になりました。任天堂すごい。

12:20-

  • サーバー上のソースコードgithubに書き出す。
  • garasuboがnginxのログ設定を整える。
  • とりあえずgolangを落としてrustを立ち上げてベンチマークを走らせる。537点。
  • GolDDranks がボット対策を始める。
  • 僕がmain.rs をエンドポイントごとに分割し始める。
  • garasubo がindexを貼ったりする。
  • とりあえずserver1をapp、server2をmysqlという構成でやってみることにする。

15:00-

  • GolDDranksのbot対策はあまり効かなかったらしい。
  • main.rsの分割が終わったのでsearch_estate_nazotteを見てみる。SQLで点が凸法の内部にあるかどうかを判定しているが、幾何ライブラリを貼って全部ローカルで計算するようにする。638点。

16:00-

  • garasuboがindexを貼る。721点。
  • GolDDranksがメモリキャッシュをやり始める。
  • garasuboがmysqlサーバーの負荷分散のためにchairとestateをそれぞれ別のサーバーで管理する実装を開始。
  • 僕がestateを全部メモリに載せる実装を開始。

17:00-

  • GolDDranksのメモリキャッシュが完成する。static な AtomicPtr があるなど勢いがある。1040点。
  • 僕がrecommend でSQLを叩かずにオンメモリのestateから結果を返すようにする。1105点。

18:00-

  • garasuboの2台mysql実装が完成する。1775点。
  • garasuboがクエリキャッシュを有効にする。2465点。

19:00-

  • 高負荷に耐えられるようになったのでランダムにメモリキャッシュが壊れるようになる。
  • 僕は用事があるのでここで離脱。

20:00-

このあとgarasuboがindexを貼って3084点を出したりしたらしいですが、ベンチマークガチャを回して2684点で終了したらしいです。

感想

  • シンプルな仕様でありながら面白い問題だったと思います。作問者はすごい。
  • Rustの参考実装もシンプルで素直な実装になっていて、大変取り組みやすかったです。
  • コンテストを突然延期したりコンテスト中は順位表やベンチマーカーが壊れていたりして競技の体をなしていなかったのは、少しもったいないと思いました。
  • 参加者用のインフラは非常に安定していて、問題に集中することができました。
  • 本戦もがんばります。