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における定石なのかを知ることが、まず重要であるということを実践で確認することが出来ました。

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

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