ta-dadadadaのブログ

忘備録とポエム

isucon8 予選敗退した感想

今更ながら、9/15,16 に開催された isucon8 予選大会に参加し、予選敗退したので、感想を残しておこうと思う。

課題

チケット予約システムをはやくすること。 サンプルとしてぜんぜんイケてないアプリケーションが与えられるので、スケールアップ以外のほとんど全ての手段を使って良いので「いい感じにスピードアップする」ことが課題。

 

事前準備したこと 

  • ある年の過去問やってみた
  • チーム用の git レポジトリを準備
  • チーム用の slack を準備
  • slack に git からのイベント通知がくるよう設定

当日

まずやったこと

スキルセットとして低レイヤー(ミドルウェアとか)のことはあまり知らなかったので、アプリケーションレイヤーで改善点を探そう、というのは個人的な作戦を立てていた。

幸い MySQL は少しだけわかるので、いわゆる n+1 クエリを探しつつ、とりあえずコードを読んだ。言語は普段から触っている python を選択した。 明らかにイケてなさそうなところをいくつか発見したので、中でも n×m×l クエリになりそうな一番やばそうに見えたところのチューニングに照準を合わせることに。 その過程でモデル定義が激ヤバなところを横目にしつつ、いくつか index 追加しながらチューニングに取り組む。

  アプリケーションレイヤーでうまくキャッシュする、ということを考えたあたりで若干躓きながら時間を浪費する。

躓き

 チームメンバーが構成変更やらミドルウェアやらについて触っていてくれたのだけど、 構成変更するとうまく動かないという話がでてきたので、そちらを齧り始める。

  結果的には init 処理の向き先をちゃんと設定してやらないとダメ、という話だったのだけれど、 なかなか原因の特定ができずに昼からの数時間を費やした。

  並行して、 sheet テーブルがヤバすぎるのでなんとかしよう、というところにも取り組んだ。 適当にキャッシュしようとしたところ上手く整合性がとれずにベンチマークがこけつづけて、これにも時間を吸われる。

  その間の雰囲気はわりとお通夜だった。

クエリ改善

 構成変更がなんとかなったのが 16時とかで、そこから改めてクエリチューニングに取り組む。 ある程度改善できたのはほとんど滑り込みの時間だった。

コンテストの終わり

事前喚起されていたので再起動テストもやってみるか、というのを当初は計画していたが残り時間的に全く手がつかず。 コードを眺めていたチームメンバーが意味不明な処理を見つけたりしたのでやっつけで直したりしつつ、コンテストは終わりを告げた。

結果1

最終的に手元のベンチマークではなんとか 10000 ポイントをマーク。 ただこれは最良時の話で、確率的に 5000 から 10000 の間を行き来する、という感じだった。

結果2

最終的に公式発表されたスコアは 5000 ポイントくらいで、 150 位というところだった。 残当だなという感覚と思ったよりいったな、という感覚が同居する総合すると残念な気持ちでコンテストは終わった。

感想戦

うまくいったチームの話を聞くと、モデルがヤバいからモデル自体に手を入れたというのを耳にした。 たしかにそれはやればなんとかなったなという思いがあり、実際やったらスキル的に間に合わなかった気がしつつも、特に後悔しているポイント。  

全体的にはもうちょっとミドルウェアの知識があればスムーズだったなーという感が強い。

  とはいえ終わってみればたいへん楽しかったので、来年に向けて精進したいと思います。