isucon6予選2日目に参加して2位で通過しました

はじめに

isucon6予選2日目にチーム「流れ弾」として@hilotter,@tkuchikiと参加させていただきました。

役割分担としてはインフラ周りやDBを@tkuchiki、に自分と@hilotterがアプリ周り担当しました。 仕様言語はGoとPerlです。

事前準備

今回は、メンバーに第一子が誕生した直後という事もあり皆で集まって問題を解くということはしませんでした。

とはいえ各自でpixiv-isuconや、iscuon3の予選問題を解き、

  • 〇〇で伸び悩んでるんだけど
  • ××したら伸びたよ
  • お、△△点ぐらいになった

みたいなやりとりをチームSlackでやっていました

また、デプロイや各ミドルウェアの設定ファイルなどは@tkuchikiに前日にレポジトリにコミットしてくれていました。 多謝🙏

当日 ~ 10:00

  • 9:30頃に会社に到着し、会場設営やレギュレーションを読み直すなどしながら待機

10:00 ~

  • マニュアル読んでazureの起動してくるのを待つ
  • nginxなどのログフォーマットをltsvに変更するのを待ちながら@hilotterとコードを読む
  • Perlでの初期ベンチは2000点ぐらい
  • @tkuchikiにGoのアプリケーションを起動してもらうのを待ちながら@hilotterと役割分担の話し合い
  • 自分が/の遅いところを直す @hilotterがisudaとisutarの結合の役割分担してスタート
  • Goの初期ベンチが0でこれは大変な戦いになりそうだと笑っていた

11:00 ~ 12:00

  • //keywordでhtmlfyの度にSELECT * FROM keyword してたのをまずはやめる方向で実装
  • とりあえず起動時にregexpのオブジェクトを作って/を書き直すことにしてみる
  • 実装し、ベンチをまわしてみるも 257点で笑う

12:00 ~ 15:00

  • Goのregexpが遅いのは何となくしっていたけどここまでか…regexpの呼び出しを減らしてもたかがしれてるだろうな となる
  • 生成されたhtmlをcacheするしかないよね
  • でもdeleteとか新しくkeywordが追加されたらどうする
  • とりあえず実装しながら考えるかー となって実装開始
  • 最初は起動時にmap[string]string で雑にcacheすることにしてcacheを作るが全然終わらない
  • これは起動時のたんびに作ってたらやばいのでRedisに入れ直すように変更
  • cacheを作り直すも30分以上たっても800件程度しか終わっておらず焦る
  • 他の参加者が数万点いってる傍ら数百点で絶望感が漂う

15:00 ~ 16:30

  • とりあえずcache作るscriptをPerlで作りなおす
  • 途中utf8のエンコード周りで嵌って40分程度かかって作成
  • その時Goで実行してたやつは3000件弱程度しかできていなかった
  • 実行すると15分程度で作成完了
  • Perlはえー!!! って叫んだ記憶がある
  • ベンチ実行してみると10万点超えて歓喜!
  • DBに入っていたデータをキャッシュしただけだし、PASSとはなっているもののメッセージがめっちゃ出てて不安になる
  • 他のチームから運営に質問があったが大丈夫そうなので直す/直さないの議論があったがこのままで行くことに
  • ベンチマーカーのメッセージとdeleteがアクセスログを見る限り実行されていない事から推測し、新規で投稿されたデータもキャッシュしておけばいいのではと…悪い囁きに支配される
  • ベンチ実行後に追加されたデータをキャッシュに乗せていく
  • MAXで19万点でる

16:30 ~ 18:00

  • 時々出るFAILの対応のためにunix socketに変更
  • 再起動試験を繰り返す
  • ベンチ時に/initializeが大量に叩かれFAILになるという謎のバグに遭遇
  • この辺で時間を喰ってそこからはあまり得点アップはせず
  • unix socketからportに戻して何度かベンチを回す
  • 落ち着いてきたところで残り30分程度
  • ベンチで最終スコアが0になったら元も子もないという話になり
  • 「エンキューする? どうする??」とかビビりながら 155,568 で落ち着く
  • 10分前には再起動してブラウザから問題なく見れてることを確認してfinish

18:30 ~

  • その日は解散して自宅で結果を待つ
  • なんとか2位で予選通過

感想

正直まぐれで勝てたと思っています… 0点でも全然おかしくない手応えでした。

が、せっかく本戦に参加出来ることになったのであと1ヶ月準備してなんとか爪痕を残せるように頑張ります!!!

最後に

ISUCON運営の皆さん、本当に準備/運営ありがとうございます。 おかげさまでとても濃密な1日が過ごせました。

本戦もよろしくお願いします。

あわせて読みたい