guri3.dev
Published on

ISUCON10 振り返り

2020年9月12日(土)に ISUCON10 のオンライン予選に参加しました。 ISUCON 自体は今回が初めての参加だったのですが、準備・予選ともにとても楽しかったです。 しかし、結果としてはスコアをほとんど伸ばすことができずに悔しい思いをしたので、今回どのような準備をして挑んでダメだったのかの記録を残します。

当日までの準備

当日まで、準備として以下のようなことに取り組みました。

  • ISUCON9 予選問題を用いた開発手順・当日やることの確認
  • New Relic の勉強会に参加
  • ISUCON9 予選問題を用いたチューニングの練習

予選問題で開発手順・当日やることの確認

まずは ISUCON の雰囲気を掴むために、これまでに開催された ISUCON に参加された方のブログなどを読みました。 多くのブログで最初の1時間ほどで用意した設定等の反映等がスムーズにできると良いということが書かれていたので、最初に何をする必要があるかをまとめました。

下のようなメモを残して置いて、調べておこうという段階まで用意しました。

# 開始時やること一覧

* (クラウド環境セットアップ)
* サーバーに接続するための設定
    * ユーザーの作成
    * sshの設定
* GitHubリポジトリへのPush
* ローカル環境での開発環境構築
* 初期実装スコアの確認
* デプロイ自動化
    * Slack通知
* New Relic等計測ツールの導入
* (監視)
* (MySQLデータサイズの確認)
* ミドルウェアの設定変更

また、具体的にどのような問題が出てくるのかというところを理解するために ISUCON9 の予選問題の環境構築を行いました。

以下の Github リポジトリの README を用いて環境を作っていたのですがうまくいかず、探してみると公式でローカル環境の作り方を解説していたので大変助かりました。

https://github.com/isucon/isucon9-qualify

ローカル環境でISUCON9予選の問題を動かす : ISUCON公式Blog

用意したローカル環境で、ベンチマークの実行とアプリケーションの動作の確認を行いました。 ここではチューニングには手をつけず、いろいろ準備をしてから取り組むことにしました。

New Relic の勉強会に参加

ISUCON10 期間中は New Relic が無料で使えました。

ISUCON10参加者向けNew Relic特別無料ライセンスの利用手順について - New Relic公式ブログ

個人的にも興味があったので、今回はパフォーマンスの計測に New Relic を使ってみたいからいろいろ調べとくねという感じでメンバーに話しました。 今までは他の人が作ってくれたダッシュボード等の確認ほどでしか使ったことがなかったため、ISUCON で使えるくらいまで勉強しようと考えていたところ、せっかく無料なのでISUCONでNew Relicをスッと使う方法 なる大変ありがたい勉強会が開催されていたので参加しました。

ISUCON の問題をお題に、 New Relic の導入やチューニングへどうのように活かしていくのかということを一通り知ることができて大変勉強になりました。 後述する予選問題を用いたチューニングの練習でもこちらの勉強会の資料を元に New Relic 導入の素振りをして、本番での導入で困らないように準備しました。

チューニングの練習・当日用準備いろいろ

本番1~2週間前から予選問題を用いてチューニングの練習を少しずつ行いました。 一から全て自分でやる力が自分にはなかったので、ここでも先人のブログを参考に自分の手でチューニングを試すことを目的に進めました。

問題への New Relic の導入を行ったのちに、以下のブログで実施している施策を一通り試しました。

ISUCON予選突破を支えたオペレーション技術 - ゆううきブログ

ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術 - Hateburo: kazeburo hatenablog

MySQL のデータサイズやインデックスの確認等、本番でも行うであろう手順を Issue にまとめながら実施しました。

ここまで一通り行ったのちに、まずは何も参考にせずにアプリケーションの改善に取り組みました。 インデックス貼って、 N+1 を直してみて...とやりましたが、うまくスコアをあげることができず、再び先人のブログをなぞりながらの勉強に切り替えました。

ISUCON9 予選を全体1位で突破しました - takono.io を参考に、一つ一つ施策を試してはベンチマークを確認してという手順で勉強していきました。

実際にコードが公開されていたので大変参考になりました。同時に、 Golang で参加するのきつくね...?と不安も覚えました(初日にチームでGoでやるかという話をしていた)。

あとは、これまでの練習を元に用意できるものは用意しておこうという感じで、以下のものを用意しました。

  • デプロイスクリプト
  • Slack通知用スクリプト
  • 各種設定ファイル
    • MySQL
    • Nginx
    • sysctl.cnf

当日のサーバーへの接続等を把握しきれておらず、どれもそれなりに作っておいて当日調整しようという感じで軽めに用意しました。(これは失敗だった)

当日

当日は最初の通りスコアをほとんど伸ばすことができなかったので、自分がやった施策と反省点を簡単にまとめます。

やったこと

  • 当日マニュアルの読み合わせ
  • GitHubへのコードPush
  • 初期設定ファイルのバックアップ作成
  • デプロイ・Slack通知周りの整備
  • New Relic の導入
  • searchEstatesのクエリのAND条件をBETWEEBに変更
  • searchChairsのCountでSQL実行しないように変更

反省

New Relic 導入したのちに searchEstatessearchChairs が遅いらしいぞということがわかったので、その部分で怪しそうなクエリを探して直していました。大まかなボトルネックを理解したのちの原因追求をうまくできず、実施している改善の根拠が薄いのがよくなかったと思います。 また、自分自身の Golang スキルがなさすぎて実装に時間がかかる&バグを埋め込んで修正に時間がかかるという状況が多くありました。

👇 苦しんでいる様子

苦しんでいる様子

事前に用意したデプロイスクリプトも不完全なままチームに共有していたりして、アプリケーションの再起動がうまくいかずに不具合の特定が遅れてしまったことも、修正が遅くなった原因としてありました。

改善するべき点としては、

  • 手に馴染んだ言語を使ってアプリケーションの仕様理解や改善にだけ集中できるようにする(or Goでいくならちゃんと勉強する)
  • サーバーに入ってのオペレーションを可能な限り自動化する
    • 設定ファイル・スクリプトの配置とうは1コマンドで実行できるようにするべき、手でやると状況把握が大変すぎる
    • 設定に時間がかかるとアプリケーションを理解する時間が十分に取れない。それで焦って手当たり次第やってみるになったのがよくなかった。

そのほかは、地道にミドルウェアの知識やチューニングの経験を増やすしかない... たくさんの過去問があるので、チーム含めてもっと練習の機会を増やしたいなと思いました。

感想

いろいろと反省点はありますが、初めての ISUCON はめちゃくちゃ楽しかったです。 準備・当日ととても勉強になったし、競技中の熱さが大変よかったです。 競技後の感想戦は『すごい...』という思いで眺めてました。

次の機会に向けて、リベンジできるよう日々精進していきます。