ISUCON13ふりかえり

takak
·

当日のリポジトリ

https://github.com/takak2166/isucon13-go

結果

やったこと

  • 10:00 当日マニュアルを読む、環境構築(初回ベンチ)、用意していた最初にやることリストの実施

    • ブラウザからどんなサービスなのか見たり、スコアがどのように算出されるのかを把握したり

    • 大事そうなところは写経してメモしてそれを参照するようにした

      • DNSに関するところとかアイコン画像配信のところとかデータベースの初期化方法とか

    • たぶん3台とも同じスペックだと思うが、4000を超えるインスタンスがあったのでそいつに対して最初はチューニングしていくことにした

    • 最初にやることリストは↓のような感じ

      • [ ] VSCodeのRemote SSHでサーバーにログイン

      • [ ] 使うサーバーのスペックと動いているサービスを調べる

      • [ ] 各コンポーネント(web/app/db)がどう起動されているかの設定やconfigの位置を把握する

      • [ ] ログ解析の準備(セットアップスクリプトの実行)

      • [ ] GitHubに初期状態をpush

      • [ ] コンフィグファイル編集(nginx.confとかmysqld.cnfとか )

      • [ ] DBスキーマの定義を調べる

  • 12:00 最初にやることリストが終わって(マニュアルを熟読しすぎて時間かかりすぎたかも)再度ベンチ→ログ解析

    • livestream_tagsにindexが張られてないことに気づいてindexを張った → 5,146

  • 13:00 ログ解析の結果からiconに対するリクエストが多いことに気づき、マニュアル内にあったアイコン画像配信に関する記述を思い出して読み返しながらコードを読む

    • userテーブルにicon_hashというカラムを追加する方針で実装

      • 実装し始めてからベンチが成功するまで3時間半くらいかかった😇

      • → このときのスコアが3,634(実装に時間がかかった上にスコアが下がってしまってなんもわからんになった)

  • 16:30 ログ解析の結果とコードを見ながらN+1問題を見つけて解消し始める

    • ChatGPT先生の力を借りながらstaticsにある3,4つぐらいのN+1をsqlx.Inを使うことで解消(残り時間があんまりなくて焦っていたのであまり記憶がない)

    • → このとき5,160で一応最高スコア?

  • 17:45 DBを他のサーバーに分離しようと思ったけどなんかうまくいかずそのままごちゃごちゃやってる途中でフィニッシュ😇

感想

  • 去年よりは何をすればいいかわからないような時間は減ったが、実装に時間がかかった+スコアが上がらなかったでだいぶ気持ち的に焦ってしまった

  • コンポーネントを他のサーバーに分離させるためにどうすればよいかは先に確かめておくか、分離させる時間として最後の1時間くらいは確保したほうがよさそうだと思った

  • DNS水責め攻撃の問題は結局何も触れられなかったが、そこをまずは着手すべきだったのかもしれない

    • (スコアの算出にも関わっていたはず)

  • やはり1人参加だと全然手が回らなくて厳しいという気持ち