初参加は結果惨敗でした。チーム名は「Ta-da!」 Slackのロード画面で出てきたので、それを使いました。
以下が最後の結果
両日では、69位のようですね。 ISUCON7 オンライン予選 全ての順位とスコア(参考値) : ISUCON公式Blog
事前準備
会社のメンバーで参加したので、社内Slackを作成。 計測が大事なので、計測ツールだけ選定しておきました。
- logの調査:alp
- slow-query: pt-query-digest
- Gitリポジトリの作成
- ISUCONの過去の講評を読む
本番にやったこと
担当割り振りは、インフラ、アプリ、アプリという構成で行いました。 自分がPythonを書けることから、言語はPythonで選定されていました。
序盤
インフラ担当が、ssh周りや地盤を固めてくれてたので、 自分はデプロイスクリプトなどアプリ周りの足回りを固めていました。
【自分の中での失敗】
アプリケーションの挙動の把握にものすごい時間がかかった。 序盤で、2~3時間くらい開発環境を整えるのに時間を食うという失態。 マニュアルを読むべきでした。。。 そもそもsystemctlで起動していたのに、gunicornを直接触ろうとしていた。
ローカルで動かせるようにしていなかった。 これもちょっと修正して、デプロイして動くか確認。という果てしない行動を行っていて、ローカルで動かしていればそんなdebug一瞬だったのにという。。
やっとローカル環境を構築して、開発がちゃんと動き始めたのが、4:30くらいから。。
中盤
やっとおれたちのISUCONが4:00くらいから始まる。
/messagesと/fetchと/iconsが遅かったので、 分担を
- 自分が/iconsの対応
- もう一人が/messagesと/fetchの対応
と振りました。 この時点で、よくわからんsleepは消しとこ。ってなってsleepは消してしまった。。。
iconsの対応は
- profileで更新したiconをDBではなく、ファイルに吐く
- 既存のアイコンを全部引き抜く
- read先をファイルのアイコン、なければDB参照
の3ステップで対応しました。
それまでずっと4桁だったのが、この上記3つの対応を終えた瞬間に5万まであがり、さらにnginxの設定でexpiresを変更してから、7万くらいまであがりました。 Maxの値ですね。
あとは、N+1問題を解決するために、メモリに載せ2クエリにしました。
ここで、3台の構成を キャッシュ(nginx)→Web(Python)→MySQL という構成にしました。
終盤
その後ベンチを掛けるたびにスコアがおちていってしまいした。
ただベンチを掛けるとCPUがPythonで詰まってしまい、そもそも毎回userに問い合わせる必要なくね。 となって、20:00くらいからuserをglobalのdictに載っけようということで、作り直したんですが、時間的に間に合わなくデプロイできず。 途中まで作ってもベンチを掛けたらバリデーションでスコアがガタ落ちしたので、戻しました。
まとめ
総じて、面白かったです。 本戦に行けなかったですが、また参加できればしたいと思います。
次回への教訓としては、
「マニュアルをしっかり読む」
ですね。 ありがとうございました。