ISUCON10予選にk02で参加して敗退しました

ISUCON10予選にいつものメンバー(kyokomi, yasu)で参加して敗退した。
最終スコアは1,188で、全チーム(468チーム)の中では129番目。
初期スコアが500前後、予選通過ラインは2,100ぐらいだったので、良いとは言えないスコアかなと......。

ISUCON10 オンライン予選 全てのチームのスコア(参考値) : ISUCON公式Blog

準備したこと

今回はNew Relicさんが無料ライセンスを提供していたので、ありがたく使わせていただきました 🙏
事前にライセンスを発行し、ISUCON9のアプリに組み込んで、どのような情報が取れるかを確認。

ISUCON10参加者向けNew Relic特別無料ライセンスが利用可能となりました : ISUCON公式Blog

当日

初動

まずはいつも通りの対応

  • レギュレーションを読み込む
  • ドキュメントを読み込む
  • サーバにログインする設定を追加
  • アプリの動作確認
  • 構成の把握
  • GitHubにコードをpush
  • 修正入れずにベンチマークを実行

次に事前に準備したNew Relic関連を設定

  • New Relic Agentを全台に導入
  • アプリにNew Relicパッケージを導入

修正内容

分担しながら以下を実施

  • NginxでBotを弾く
  • MySQLを別サーバに移動
  • INDEXを貼って /api/estate/low_priced/api/chair/low_priced を改善
  • rent, width, height などを範囲ではなくIDで検索するようにする
    • 併せてINDEXも追加
  • 検索条件のjsonを毎回parseしないようにする
  • estateにgeometryのカラムを追加して、なぞって検索のN+1を解消
  • /api/recommended_estate/:id のクエリ改善(時間切れで修正間に合わず)

良かったこと

New Relicが便利

f:id:waniji:20201003020334p:plain
New Relicの画面

どこに時間がかかっているか、修正した結果どのように変化したかがとても分かり易かった。前回までは手元で集計・分析してSlackで共有していたが、その手間が省けて効率的に進めることが出来た。ただ、New Relic自体の習熟度が低かったので、活用しきれたとは言えなかったのは反省点。

毎回やっていることは詰まらず出来た

MySQLの分離、MySQLのスローログ分析などは毎回やっていて、手順もチームのScrapboxにまとまっているので、何も詰まらずに作業ができた。

反省点

MySQLの知識不足

Generated columnsDescending index はそもそも知らず、Geometry についてはヒィヒィ言いながら調べて対応したのでかなり時間がかかった。DB分割が出来ていればかなりスコアが上がったのでは......という気はするので、MySQLの知識不足がかなり痛かった。

問題解決までに時間がかかりすぎた

解説を見ていると、分かってはいたが修正が間に合わなかった事が多い事に気づいた。どの修正が一番効果的かをチームで話し合いながら進めたが、とにかく手を動かして改善をし続ける人が一人はいたほうが、結果的にスコアが伸びるかもしれない。(単純に実力不足というのもある。悲しい。)

ISUCON10 予選問題の解説と講評 : ISUCON公式Blog

おわりに

今回も楽しかったし悔しかった。
次回があればまた参加します。
運営の皆様お疲れさまでした。