右上↗

プログラミングに関するメモをのこしていきます

ISUCON 7 本戦出場してきました 「都営三田線東急目黒線直通急行日吉行」

ISUCON 7 お疲れ様でした!

僕らのチーム,「都営三田線東急目黒線直通急行日吉行」は学生枠 2 位,全体で 10 位という結果でした.

予選の結果が異常によかったので完全に調子に乗っていたんですが,本戦はやっぱり難しかったですね... 本戦でも社会人上位勢と戦えるくらいのスコアを出すのと学生枠優勝が目標だったのでやっぱりくやしい.

やったこと

結局テンパりすぎてスコア記録を残せていないので,なんとなく記憶を頼りに...

Go 実装でいきました.

  • room 名から ws をつなぎに行くホストが一台に固定されるように
    • 同じルームの action は全部同じホストにいくように
    • これでオンメモリに出来るようにした(結局ほとんどオンメモリにデータは持たなかった)
  • ルーム名から適当なハッシュ値を計算してふるようにしていたけれど,ルームによってアクセス頻度とかがちがうっぽい?ことに気がつく
    • 3 台に振ってるはずなのに,CPU 使用率を見ると 2 台しか使われていないとか
    • 負荷分散が運ゲーになっていて改善の結果が見にくかったので,とりあえず 1 台しか使わないように
  • ホストごとの接続数を redis に入れて,空いていそうなところに振り分けるように
    • 前段のサーバに nginx + app + redis を入れて,そこの redis に room -> host の対応情報を入れた
    • CPU 使用率で振り分けたほうが良かったかもしれない
  • schedule の計算過程を最適化出来る気がしなかったので,結果をキャッシュしようと試みる
    • どうやっても事後検証をパスできなかったので捨てることに...
  • 部屋ごとにロックをとってすべての操作を直列にした
    • トランザクションとかが複雑すぎていじれる気がしなかったので,一旦直列にして考えることを減らそうとした
    • rollback 考えなくて良くなったのでこれ自体は良かった気がする
  • @izumin5210 が adding/buying を redis にいれたり,過去の adding をまとめてくれた
    • ここは完全におまかせしてしまった
    • 最終的にまともに効いたのはこれだけだったのでは
  • 終盤はベンチマーカに弾かれる原因をひたすら探していた
    • 安全側に倒そうということで,色んな所でひたすらロックを取るようにしてなんとかパスした

という感じで,最高スコアが 17000 くらい,最終スコアが 16700 で終了しました.

反省

  • チーム名が長すぎた
    • 名札のチーム名部分のフォントが他のチームより小さかった気がする(ご迷惑おかけしていたらすみません...)
    • 手書きで書くのがつらすぎる
    • 来年は気をつけます
  • テストがせっかく用意されていたのにまったく使わなかった
    • テスト使っていたらもうちょっと計算過程の最適化にも手を出せたかもしれない
  • なにも操作がなくても 500ms ごとに status を計算していたところの最適化を入れきることができなかった
    • この計算は room ごとに一回やれば良いはずなのにコネクション一個につき一回計算していた
    • room ごとにひたすら status を計算し続ける goroutine を起動してそこから返す実装を書いていたが,終盤の fail 祭りにびびっていれられなかった...
    • 意味があったかどうかはよくわからない.
  • CPU profile をみて,bigint の計算がやばいことはわかっていたのに,手が出せなかった
    • この複雑さは結果をキャッシュしろってことだな!って勝手に思い込んでいたけど,結果のキャッシュも複雑で無理だった
    • 他のチームの方の話を聞く限り,そんなに無茶な最適化じゃなくても地道に最適化していたらそれなりにスコアに効いたのかもと思った(これはやってみないとわからないけど)

予選のときも練習のときも,「遅いのはわかっているけど複雑そうでやりたくない」部分を触らないとだめっていう教訓は得ていたはずなんだけど,結局そこでやられてしまったのが一番くやしいですね...

来年は学生枠ではなくなるのですが,社会人枠でも本戦にでて勝ちたいです!

去年に引き続き本戦に出られたのはほんとうに良かったし,またまた勉強になる良い経験でした!運営の皆様お疲れ様でした & ありがとうございました!