ISUCON10 予選突破しました!

ISUCON10に参加しました!ISUCONへの参加は今回で2回目。前回の参戦記はこちら

結果は全体490組中、10位(?)で予選通過しました!スコアに関しては公開されたら記載しようと思います。(おそらく2500~3000の間くらい?)

今年運営の方は、予選本選どちらもオンライン開催となったり、isuconポータルの対応したり、競技時間が変わったりして、大変だったかと思います。お疲れさまでした。

はじめに

メンバーについて

前回と同じで、自分(aru03)とqitoiの2人で参加しました。「3人で出る」というのを前回の反省点に挙げましたが、それは未達成。

役割については、前回同様

  • インフラ:qitoi
  • アプリケーション:aru03

言語選定について

言語はgoにしました。「来年参加する際にはgoにしよう」と去年の参戦記で書いたのでその通りに。去年の使用言語比率はgoが多かったことが理由です。

事前練習について

2~3週間ほど前から各々で過去問さわったり、go触ったりしました。1週間前には、zoomつないでISUCON9の本選を使って、リハーサルをしました。リハーサル環境の準備とかもろもろqitoiがやってくれたので助かりました。圧倒的感謝ッ…!

当日タイムライン

08:40予選開始時刻変更のアナウンス(12:00に変更)
11:00zoom通話開始
11:15初動でのやることリスト化と相談
11:50予選開始時刻変更のアナウンス(12:20に変更)
12:20競技開始
12:30ssh_configの共有・設定
12:35ソースコードをgit管理
12:35使用ミドルウェアの共有(nginx – app – mysql)
12:40DBスキーマとレコード数の共有
12:55レギュレーション・マニュアル読み合わせ
⇒前回の反省を生かして念入りに
13:20[ベンチマーク実行]484
13:35デプロイジョブ設定
14:00alp・pprof導入
14:20index追加 estateテーブルに(rent,id)
14:40index追加 chairテーブルに(price,id)
14:45mysqlログとnginxログをデプロイ時にバックアップ
14:52chairテーブルでのselect for update撲滅
└ stockカラムにunsigned追加
14:56[ベンチマーク実行]616
15:30bot除外対応
15:32[ベンチマーク実行]678
16:15mysql8導入・降順index追加(latitude, longitude, popularity desc, id)
16:19[ベンチマーク実行]362
⇒mysql8導入でスコアが下がったと判断してmysql8化断念(※1)
16:40ログローテートジョブ設定
16:47[ベンチマーク実行]657
⇒mysql5.7のDBを向くように修正
17:10アーキテクチャ変更の方針決め
・サーバー1: chair/web + chair/db
・サーバー2: estate/db
・サーバー3: front + estate/web
17:33chair.stockにrangeパーティション追加
17:44アーキテクチャ変更対応
17:48[ベンチマーク実行]1011
18:12nazotteのN+1クエリ撲滅
18:14[ベンチマーク実行]1381
18:18index追加 estateテーブルに(latitude,longitude)
18:21[ベンチマーク実行]1780
19:11estateにsearch_popularityカラム追加とindex追加
⇒popularityの降順index解消のためのカラム。int最大値 – popularityの値が入る
19:12[ベンチマーク実行]2131
19:25chairにsearch_popularityカラム追加とindex追加
19:28[ベンチマーク実行]2093
⇒あまり効果がなかった..?
19:41index追加 chairテーブルに(stock,price,id)
└ getLowPricedChairのクエリ改善
20:23pprof排除
└ 21:00の競技終了に向けて不要な処理を外していく
20:35SetMaxOpenConnsを10->20に変更
20:37[ベンチマーク実行]2696
20:40再起動試験
20:52nginxでgzip_staticを使うように設定
20:54[ベンチマーク実行]2861
21:00競技終了

(※1) 競技終了後に分かったことだが、実際にはbinlogが出力されるようになっていたためにスコア下がったらしい…?

反省

  • height,widthなどのレンジ検索への対応ができなかったです。range_idで検索かけられるようにすればよかったのかもしれないですが、そこまで手が回らなかったです。
  • popularityについては、修正方針自体はよかったのですが、insertを修正する必要があり、時間がかかりました。Generated Columnsの存在を知っていれば早めに対処ができたかと思います。
  • go自体への理解がまだ足りないのでコードの修正が必要になったときに速度が落ちた(修正方針は浮かんでいるが手が動かない状態)。これは経験を積むしかない。
  • 前回と比較したときに、マニュアルの把握漏れ、イテレーションの遅さに関しては改善が見られました。イテレーションに関しては、序中盤はwebサーバ3台のうち、使ってないサーバで検証したりできたことが貢献していると思います。デプロイ時に、ブランチの指定とデプロイ先サーバの指定ができたことが大きいです。
  • 修正コミットが凡ミス含まれていることも多かったので、プルリク形式で見るようにしても良さそう。
  • 「ボトルネックっぽいな」と思った箇所はslackに都度メモ残しておいた方がよかったと思います。時間的に自分が対応できなくても、相方が対応してくれる可能性があるので、スコアがあがる確度の高いものに関しては都度残して託しておく(スコアが上がる確度・修正方針は立っているか・実装の工数感などの情報をわかる範囲で残しておく)。

今回のオチと次回へ向けて

  • go自体をもう少し触る
  • 改善したほうがよさそうと思った箇所を書いておく(タスク用の付箋になってるとよさそう)
  • 本選初出場なので頑張ります!

余談

ISUCON10で、チーム名101010で、予選10位(?)でした。


ISUCON10 予選突破しました!」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中