😊

ISUCON 13 に参加して 20 位でした (最終スコア: 91,400 なんかいい感じではやいやつ)

2023/11/27に公開

ISUCON 13 に参加して 20 位でした (最終スコア: 91,400 なんかいい感じではやいやつ)

ISUCON 13 に参加して 20 位になりました。
また、Tver 賞として Firetv stick 4K max を獲得しました!
ありがとうございます!

image.png

image.png

参加確定まで

ISUCON 参加はこれで 3 回目でした。
最初の難関が、申し込みです。
DOS 攻撃ばりのアクセスするのは嫌だったので、参加確定券付きの個人スポンサーとして申し込みました。

割とチームメンバーは決まっていて、去年と同じメンバーで参加するかなーと考えていました。(リーダー、セキュリティ・ネットワークマスター、自分)
しかし、セキュリティ・ネットワークマスターが今年は一人で参加してみたい(多分)とのことだったので、新しく一人誘う必要がありました。

現職の CTO をなんとか説得しました。

競技前日まで

  • リーダー
  • CTO
  • 自分

というチームメンバーが確定してからは、10 月中旬くらいから 4 回練習しました。
練習した問題は、 ここら辺

  1. private ISU
  2. ISUCON Prior
  3. ISUCON10 本線
  4. ISUCON10 予選
  5. ISUCON11 予選
  6. ISUCON12 本線

当日

時間 初期スコア 最終スコア
10 時~11 時 3,816 2,224
11 時~12 時 2,224 6,766
12 時~13 時 6,766 7,570
13 時~14 時 7,570 11,218
14 時~15 時 11,218 19,875
15 時~16 時 19,875 31,206
16 時~17 時 31,206 50,472
17 時~18 時 50,472 91,400

9 時-10 時

当日は、9 時にみんなで集まりました。
昼は買いに行く時間がないので、10 時までに各々が買いに行きました。
YouTube 放送で、ライブが少し遅れた際に、「あれ、これ動画配信サイトの問題か?」と言ったのがまさか当たってしまいました。

  • モニターセットアップ
  • お昼買い出し
  • 作戦会議
  • リモートサーバー(開発用)のセットアップ

10 時-11 時

初期: 3,816
最終: 2,224

10 時 10 分くらいに、サーバーが全部立ち上がりました。
初期ベンチ  3,816 点
プロファイラー等をまいたりして、一時的にベンチが下がる (2,224 点)

一旦、powerDNS とか水責め攻撃とかわからん...になっているので、通常通り、index を貼る,N+1 解消を進めていこうになった
この段階では、user 周り等の N+1 が重そうになっていた

  • CloudFormation で、サーバーを立ち上げる
  • プロファイラーを撒く (秘伝、netdata 等)
  • 初期ベンチ(10:09:10: 3,816 点)
  • DB 周りを見る -> index 貼りましょうになる
  • powerDNS ってなんや...になる

11 時-12 時

初期: 2,224
最終: 6,766

11 時の頭に、アプリケーション、当日マニュアルを読む。
index 貼り、N+1 解消を進めていき、スコアが上がる

tags が、N+1 になっていたので、bulk にする

11:54:18, 6,766

  • マニュアルの読み合わせ
  • インデックス貼り
  • tags の bulk

12 時-13 時

初期: 6,766
最終: 7,570

tags は、insert が走っていないので、オンメモリで良さげという話になり実装する

  • user icon 周り
  • tags のオンメモリ化
  • theme のオンメモリ化

13 時-14 時

初期: 7,570
最終: 11,218

13 時くらいになると、theme のオンメモリ化を進めました。
user ごとの dark_theme 等ですが、ほぼほぼ更新がなく、データー数も 1000 くらいのオーダーでした。
失敗としては、insert があったのですがここの永続化はすっ飛ばしてはいけなかったです。(後から気づいた)

ここで、ベンチマーカーの不調もありました。

  • theme のオンメモリ化
  • mysql interpolate の有効化

14 時-15 時

初期: 11,218
最終: 19,875

次は、そもそも user があんまりレコードが少なかったのでオンメモリ化を進めました。
ここは、icon とコンフリクトして、「うーん。なんで fail するんだろ...」となっていて悩んでいました。(結局、コードに問題はなかったが icon hash の永続化周りの問題そうだった)

  • user のオンメモリ化

15 時-16 時

初期: 19,875
最終: 31,206

user のところで悩みつつ、サーバー分割を考え始めました。
また、

  • user のオンメモリ化
  • db の max_con を変えてみる(app)
  • サーバーの分割を考え始める -> (s1: app, s2: mysql, s3: powerdns)

16 時-17 時

初期: 31,206
最終: 50,472

  • サーバーの分割 -> かなりエラーが出て焦る

17 時-18 時

この時間は、やばいやばいになっていました。
サーバー分割が完了して、点数が安定するようになり安心しました。

まだ、ログを消しきれていない箇所もありましたが、もうやめておこうという判断になりました。

初期: 50,472
最終: 91,400

  • サーバーの分割完了
  • 再起動時のキャッシュが永続されていないエラーを直す
  • ベンチがちゃ

18 時以降

セブンにご飯を買いに行って、みんなで生放送を見守りました。
TVer 賞が貰えてとても嬉しかったです。

最後に

このチームでできて、とても楽しかったです!

去年は、26 位で順位が一桁足りずに本戦を逃したのが悔しかったです。
今年は、20 位、去年の挽回ができました。(優勝したかった)

30 位以上は、

  • スポンサー企業ノベルティ詰め合わせセット
  • ISUCON13 オリジナル T シャツ
  • ネームカード
  • 認定証

が貰えるらしいので楽しみ!

GitHubで編集を提案

Discussion