ISUCON12予選に チーム「焼肉ジャンボチキン」で参加して、24位でぎりぎり予選突破できました。

やったこと

最終的な方針は 

  • SQLiteをMySQLに移行せずキャッシュなどで頑張る。MySQL移行も同時並行で進めていたけど、最終的に時間がぎりぎりになりそうだったので安全そうな方針にした。
  • 1台はApp+SQLite
  • もう1台はMySQL

具体的にやったことは他のチームとあまり変わりません。時系列順に並べると

  • アプリがDocker上で走っているのを外す。
  • (tenant_id, competition_id, player_id, created_at)のインデックスをvisit_historyに貼る。
  • dispenseID()で使っているSQLが遅いので、アプリ内でのランダム生成に変える。数値から変えていいのかわからなかったのでrand.Int63() (#2)
  • SQLiteがボトルネックのようだったので、クエリを眺めながら各種インデックスを貼る。 (#4)
  • SQLiteのクエリログを吐く便利な機能があることに気づく。dsqで集計したらINSERTが遅かったのでbatch insertを実装 (#5)
  • SELECT * FROM player WHERE id = ?の数が多くて遅いので、アプリ内でcacheを作る。(ついでにCloseし忘れによるtoo many open filesを直す ) (#6)
  • もうひとつのINSERTもbatch化 (#7)
  • flockの範囲が必要以上にでかそうなので狭くする (#8) (sync.Mutexに変えたかったけどやるのを忘れてた)
  • Debugログなどを消す (#9)
  • たまにbatch insertに失敗して10%点数が引かれてたので、一気にやらずに少しずつINSERTする (#10)

感想

  • 解説で触れられているように、ボトルネックに対していろんな方針が考えられる問題になっていて面白かった。
  • 例年だけど、競技時間に対して与えられる対象が複雑でなかなか全貌を把握する前に終わってしまう。今回はUIやウェブアプリの仕様をほとんど理解することなく終わってしまった。
  • 毎年Goでやっているけどあまり書きなれてなくて厳しい。準備ができたらRustでも挑戦してみたい。