hello-world.jp.net
webエンジニアのメモ。とりあえずやってみる。

isucon12予選に参加しました

公開日時

tkuchiki, KonboiとISUCON12 オンライン予選に参加しました。

残念ながら今年も予選敗退でした。(最終スコア: 7,217)

チームメンバーの記事

  • TODO: あとで追記

当日までにやったこと

3つ過去問をやりました。

matsuuさんのcloud-init-isuconのおかげでM1 Mac環境でも手軽に過去問構築ができました。 ありがとうございます。

8時間タイマーをセットしつつ、isucon11-prior, kayac-isucon-2022は初挑戦だったので当日さながらの気持ちで練習ができました。

また、tkuchikiがalpと似た使い方でSlowLog分析ができる「slp」という新ツールを作ってくれたので、kayac-isucon-2022を解きながら使い勝手をフィードバックできたのはよかったです。

当日やったこと

全員でマニュアルに目を通したあと、初期ベンチを実行。

当日の講評でfujiwaraさんが「いきなりSQLiteを載せ替えに行くとものすごく大変」と解説されていましたが、初期ベンチが通ったあと即MySQL移行を開始し、茨の道を選んでしまいました。

移行用の sqlite3-to-sql が用意されていたのでこれを活用しつつ、SQLiteの初期データをMySQLに移行し始めたのですがデータ移行が全然終わらず。

tkuchikiにインフラ整備とデータ移行スクリプトのチューニングをしてもらい、Konboiにコードの気になる点の洗い出しをしてもらっている間に自分はローカル環境構築を進めました。

MySQLコンテナに接続できずにハマってしまいローカルでgoアプリが起動できる頃には12時になっていました。 (過去問を解いた際のDBコンテナが restart always で起動しっぱなしになっていたのが原因でした)

また、認証用のコードは提供されていなかったので、nginxコンテナを追加し /auth/ へのアクセスをサーバへproxyするようにしました。

これで一通りの画面がローカル上で確認できるようになったので、ローカル環境構築用のdocker設定と手順をチームメンバーに共有。(この時点で13時30分)

server {
  listen 80 default_server;

  root /home/isucon/public/;

  location / {
    try_files $uri /index.html;
  }

  location ~ ^/(api|initialize) {
    proxy_set_header Host $host;
    proxy_read_timeout 600;
    proxy_pass http://app:3000;
  }

  location /auth/ {
    #proxy_set_header Host $host;
    #proxy_pass http://127.0.0.1:3001;
    proxy_set_header Host isucon.t.isucon.dev;
    proxy_pass https://isucon.t.isucon.dev;
  }
}

自分がローカル環境を用意している間にKonboiがコードのチューニングをしたPull requestを上げてくれていたのでローカルで動作確認しつつレビュー。

例年は機能ごとに分担してチューニングをしていましたが、今回はMySQL移行が完了するまでそもそもベンチが実行できないという状況だったので、Konboiが実装、自分はKonboiの実装のQAテストをしつつエラーがあったら修正するという分担で進めました。

16時前にようやくMySQLへのデータ移行が完了し、ベンチを実行するも初期データチェックでベンチが通らず。

ここからはベンチを通すために全員でエラー調査と修正対応。

初期データチェックは通るようになったものの、次はデッドロックエラーが発生。

残り時間10分を切り、このままベンチが通らず0点で終わってしまうのかと諦めかけていたのですが、残り時間3分でKonboiがデッドロックエラーを修正してくれてMySQL移行後初のベンチが通りました。(更新前のデータが0件だったらDELETE文は実行しないように変更)

最後にtkuchikiが事前に準備してくれていた複数台構成に素早く切り替えてくれて競技終了。

ベンチ結果のグラフは見事な直角を描いていました。

isucon12-bench

振り返り

Keep

  • 今年はGoで過去問を解きGoで予選に参加でき、チームの言語をGoに統一できた
    • 例年は自分がGoを触っていなさすぎてRubyにしてもらったり、Ruby&Goの複数構成にしてもらっていた
  • ローカル環境のおかげで動作確認&修正が素早くできた

Problem

  • ローカル環境構築の際に些細なことでハマってしまい時間を無駄にしてしまった
  • ベンチが通らない状況が続き、計測してチューニングするサイクルを回せなかった
    • tkuchikiの用意してくれたalp, slpを活用できず
  • アプリケーションチューニングがKonboi任せになってしまった

Try

  • 前日に restart always なコンテナが立ち上がっていないか確認し、あれば止めておく
  • いきなり大技に挑むのではなく少しずつベンチを回して改善していく
    • 今回の場合だと初手で全テーブルをMySQLに移行するのではなく1テーブルずつ移行することを検討すべきだった
  • 予選問題が公開されたら忘れないうちに再挑戦する

さいごに

運営の皆様、今年もありがとうございました!

チームメンバーのお二人も毎年一緒に参加してくれてありがとう!


Related #isucon

ISUCON4 予選に参加しました

昨年と同じくチーム「流れ弾」として @tkuchikiと @Konboiと一緒に参加しました。

isucon9予選2日目に参加してきました

isucon9予選2日目にチーム流れ弾として参加し、予選通過できました。

isucon10予選に参加しました

ISUCON10予選に参加し予選敗退しました。 今年も @Konboi, @tkuchiki と一緒にチーム流れ弾として参加しました。