ISUCON11予選に参加してきました

ISUCON11 に「うどん」という本当に一瞬で決まったチーム名で参加してきました。

チームは僕と同じ大学の M2 の先輩二人とで、学生枠で ISUCON 初参加です。

作業環境

  • 開発はリポジトリGitHub に push し、各自でクローン
  • 変更はローカルでブランチを切り push、サーバーで checkout して動作確認
  • 動作に問題ない(点数が大きく減少しない)ようであれば merge

過去問の練習時は VSCode の Remote Development を使っていたときもあったのですが、負荷が大きいため途中からは原則禁止にしようということになりました。

やったこと

だいたい時系列順で、主にやったことを書いていきます(スコアは記録していないため覚えているところだけ)。

午前中

  • ベンチマークを回す
    • 3000 点くらい
  • マニュアルを全員で読む
  • 開発環境の準備
  • pprof, kataribe 導入
  • プロファイリング

事前講習でもお話されていましたが、初めにベンチマークを回しつつマニュアルを熟読しました。

isucon.net

結果的にはマニュアルの深い理解によるアプローチなどは行えなかったのですが、自分の見ている修正箇所がサービス上でどんな役割を持っているのかを大まかに把握できて良かったです。

午後前半

  • getUserIDFromSessionLIMIT 1追加
    • あまり効果なし?
  • isu, isu_conditionテーブルにインデックス追加
    • 18000 点くらい(!)
  • アプリ、DB の 2 台構成に
    • 20000 点は超えていたはず

プロファイリングの結果、postIsuCondition, getIsuConditions, getTrendが特に時間がかかっているとなったので、ひとまずそれぞれを確認しました。

インデックスをつけただけでも大きく点数が上がったので、出だしとしてはモチベーションアップに繋がりました。

午後後半

  • postIsuConditionをバルクインサートに
    • 多少点数増加したはず
  • getTrendの N+1 を部分的に解消
    • あまり効果なし?
  • アプリ 2 台、DB1 台の 3 台構成に
    • 30000 点は超えていたはず
  • dropProbabilityの値調整
    • 最終的に0.3くらいにしたはずですが、点数にはさほど影響せず...
  • サーバーの再起動テスト

アプリケーションコードの修正をいくつか進めましたが、残念ながら劇的に点数が変化したものはなかったです。

インデックスもそうですが、サーバーを増やすなど確実に効果があるアプローチで少しずつ点数を上げていった感じでした。 そういう点では練習が活かせていて良かったです。

結果

最終スコアは参考値で 30968 点で、全体では 144 位でした。学生枠としても上に数組あるようで残念ながら予選敗退となりました。

とはいえ、やるべきと考えたことが一通り出来て、結果も出せたので初参加としてはかなり良かったです。

感想

今回特に点数の向上に繋がったものはいずれも過去問で見かけた改善方法だったと思います。

過去問の練習によってどういう改善が ISUCON における定石なのかを知ることが、まず重要であるということを実践で確認することが出来ました。

一方で、ベンチマークの気持ちになって(?)取り組むようなさらなる改善にはあまり手をつけられなかったので、来年以降リベンジしたいと思います!!

運営など関係者の方々、楽しいイベントをありがとうございました。