ISUCON12予選に参加しました
お久しぶりです。いろいろあって、今年初めてのブログを書くことになりました。この記事は、7月23日(土)に開催されたISUCON12の参加記録です。チーム名にゃんべるぐで学生枠で参加しました。ISUCONは10以来の2回目の参加でした。(昨年は院試のため不参加)
結論から言うと、Scoreは最高3222、追試で3058で終了し、予選敗退となりました。(https://isucon.net/archives/56838276.html)
メンバー集めと事前準備
5月下旬、チームを組んでくれるメンバーを募集したところ、大学時代に所属していたITサークルから2人協力してくれることになりました。ayumin(@shoumoji)と、あるみかん(@AluminumMikan)です。この度はありがとうございました。
ゆる募
— Koki Tanaka (@gojiteji) May 31, 2022
ISUCONチーム組んでくれる方🙋
その後、以下のように3回に分けてdiscordのボイスチャンネルで勉強会を行いました。
- 2年前に参加したISUCON10の復習とレギュレーション輪読
- ISUCON11の予選問題をAWS上でサーバーを立てて練習
- 強い人のISUCON11予選参加記を見て、解法をまねる
メンバー全員、同じサークルだったため、コミュニケーションに支障がなかったのはとても良かったと思います。
予選当日
タイムライン形式でやったことを書いていきます。
9時
起床成功
10時
競技開始、mysqlと別でdocker-composeを使ってgoが実行されている、またmysqlと別でsqliteが使用されていることを把握。
各ソフトウェアのバージョンを把握し、特にアップデートできそうなものはないことを把握。
ベンチを回すとScoreが2400ぐらい出る。
11時
テナントDBと管理DBが存在し、前者がsqlite、後者がmysqlに入っていることを確認。
ayuminが作成してくれたコードで、new Relicで重いエンドポイントがcompetition ranking id であるとわかる。
sqliteのログの見方はわからず。/GET /api/player/player/:player_id
の処理(playerHandler
)にN+1があると把握。playersAddHandler
にbulk insert修正できそうな場所を発見。
DBのplayer_score
テーブルのplayer_id
,competition_id
カラムに複合インデックスを貼る。Scoreが3000いかないぐらいに上昇。
12時
player_id
に関するエンドポイントが重いと気づき、player_id
にもインデックスを貼ったが、スコアが落ちる。
一旦、index貼り職人になる。
sqliteとmysqlの統合ができるかなと検討しつつ、触れなかった。
13時
SQLのスキーマをBIGINT->INTに変更してみるも、反映せず。
そのほかSQLを見回る。
11時に発見したbulk insert修正に取り掛かり、displayNames
を配列で作ってExecContext
で配列のままINSERTできるように修正するも、ベンチでScoreが0になる。
14時
displayNames
に格納するdispense()
関数でidを振っていたので、そのidの振り方に問題があるのではないかと思い、dispense()
関数を見に行くも、単にAUTO_INCREMENT
しているだけで、解決せず。
15時
bulk insert修正できそうな場所をもう一箇所発見。playerScoreRows
を配列のままINSERTできるように変更。これは素直にベンチが通り、Scoreが3200ぐらいに上昇。
16時
もう一度displayNames
のbulk insertの修正に戻るも、解決せず。
log出力周りを削除する。ベンチの変化はわからなかったが、エラーは起きなかったので、反映。
N+1の箇所をもう一度見るも解決せず。
17時
サーバー1台をmysql用、もう一台をsqliteとgo用に分ける。
メンバーの作った動くブランチを全てmasterにマージ。
dockerの再起動を有効にする。
再起動試験ができることを確認。
18時
競技終了
所感
運営の方もおっしゃっていた通り、sqliteをmysqlの二つが存在しているのが今までと大きく異なる点で、「改善できそうだけど、簡単にうまく動かない」が多く発生しました。
踏み台サーバーもよく理解していなかった2年前に比べて、コーディングの問題が解けるようになったのは、少し成長できたように思います。
自分のできなかったインフラの整備やsqliteのログ取得、インデックスのチューニングなどに取り組んでくれたayuminとあるみかんには感謝です。
イベント全体を通して、とても楽しめました。関係者の皆さんありがとうございました。