お久しぶりです。いろいろあって、今年初めてのブログを書くことになりました。この記事は、7月23日(土)に開催されたISUCON12の参加記録です。チーム名にゃんべるぐで学生枠で参加しました。ISUCONは10以来の2回目の参加でした。(昨年は院試のため不参加)

結論から言うと、Scoreは最高3222、追試で3058で終了し、予選敗退となりました。(https://isucon.net/archives/56838276.html)

メンバー集めと事前準備

5月下旬、チームを組んでくれるメンバーを募集したところ、大学時代に所属していたITサークルから2人協力してくれることになりました。ayumin(@shoumoji)と、あるみかん(@AluminumMikan)です。この度はありがとうございました。

その後、以下のように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とあるみかんには感謝です。
イベント全体を通して、とても楽しめました。関係者の皆さんありがとうございました。