ISUCON8予選に参加した

はじめに

ISUCON8の予選にチーム名「GrilledMeat」で参加しました。
結果はfailのまま終了するという残念な結果でした。
その後延長期間として1週間ISUCON予選の環境を提供していただいたので当日できなかったことを試しました。
延長期間で試したことを含めて振り返ります。

実力不足を痛感させられるような素敵な問題を出してくださっただけでなく、このような振り返りの機会を用意してくださった運営の皆さま、本当にありがとうございます。

事前準備

  • 使用言語をGoにするということで入門書を読む。
  • プロファイラをいち早く揃えられるように Ansibleを用意した。
    • 内容としてはalp, slackcatをダウンロードしつつミドルウェア(MySQL,nginx)のconfigを基本的なものに置き換えるもの。
    • configの置き換えについてはプロファイラ向けの記述を省略する意味では便利だったが、既に動作しているアプリケーションがあるのにとりあえず書き換えておくというのはあまりよくなかった。

当日

  • サーバーに入ってミドルウェア構成を見たり、ブラウザからサービスを閲覧して調査を行う。
  • h2oに対する知見はなかったが、当初はh2oをうまく使いたいと思いnginxへの置き換えを考えていなかった。
  • h2oのconfへalp向けにtsv形式でのログ出力を追加し、slow-queryの出力をするように設定変更。webapp動作言語もGoに切り替えてベンチマークを回す。
  • ベンチマークの結果に基づいてindexを適当に追加してみるなどしてみたがスコアに変化はなかった。
  • pprofも入れて再度ベンチマークを回す。getEvent、getEventsを改善するのが効果的だと判断し、そのあたりのコードを読むことに。
  • getEventsのselectをまとめてアプリケーションで処理するように修正。スコアは22000くらいになる。
  • 引き続きクエリをまとめたり処理の効率化を図ったが改善せずfailを繰り返すようになった。
  • sheetsをハードコードしたり、いらない処理を消していった。継続的にベンチマークを回し、failしないパターンに当たり最高点である約26000を記録する。
  • failを止めようにも止め方がよくわからなかったため、h2oを使って複数台構成を試みたが、failが頻発したまま終了した。

反省

  • failせず安定してスコアを出し続けられるように対応する必要があった。他の細かな実装の改善よりもこちらの方が重要だったと思う。
  • h2oからnginxに切り替えるべきだった。h2oをうまく利用するべきだと思っていろいろ調べていたが、その調べる時間でアプリケーションをより良くすることもできたと思う。
  • 役割分担について明確にできていなかった。本番をイメージして時間を区切って過去問を解くといった準備が足りなかった。

感想戦

  • 本番ではgetEventの改善やindexの修正が不十分だったため、それらを感想戦で試した。
  • failが頻発する問題についてはロックなども試したがうまくいかなかった。結果としてreportのところにsleepを入れる方法でベンチマークは安定した。
  • 複数台構成、Redis利用は試すことができなかったが、アプリケーションとインデックスの改善のみで最終的に以下のスコアになった。 f:id:shintaro-watanabe1226:20181002091954p:plain

全体振り返り

  • 結果論ではあるがアプリケーションコードとDBの改善のみで一定以上のスコアになった。
  • あれこれ試してみたいと思い当日の限られた時間を有効活用できなかったことが良くなかった。
  • 安定的にアプリケーションを動作させるということはISUCONでスコアを稼ぐことだけでなく、普段でも重要なことなので、そのための知識や経験を得ていきたい。
  • 次回は時間の使い方を意識して、自分のやることのスコープを絞ってより良い結果を出せるようにしたい。