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