tekiehei2317's blog

private-isuで練習した振り返り

投稿日: 2022-07-18

private-isuを2日で合計8h~くらい遊んだので、やったこと・学んだこと・改善点をまとめようと思います。

ISUCONの予選と比べるとアプリケーションの規模が小さめで、スコアの計算方法もシンプルなため、初心者の自分にとってちょうどいい練習の題材だったと思います。

改善する箇所の見つけ方

改善する場所は、以下のように見つけました。

  • alpでSUMが大きいエンドポイントを見つける
  • エンドポイントの中身とクエリの解析結果を比較して、問題を見つける

問題を見つけたら、改善策を実施し、解析結果が改善されていることを確認します。解析結果が改善していれば、スコアも一緒に伸びることが多いです。

やったこと

  • 初動の練習(gitの設定、ツールのインストール、アプリケーション構成の把握、計測・分析)
  • クエリの改善(インデックス、LIMIT、N+1のJOINでの解消、N+1のプリロードでの解消、プリペアドステートメントの削除、…)
  • Nginxでの静的ファイル配信(CSS・JSの配信、アップロードした画像の配信)

クエリの改善がメインでした。クエリの本数を減らすとその分のDBのキャパシティが開くので、効果的だということが分かりました。

学んだこと

  • 遅いクエリでRows examinedが大きい場合は、インデックスやLIMITをつけて改善する
    • すぐできるのでコスパがよいです
  • N+1の改善は、1:1の場合はJOIN、1:Nの場合はプリロードで改善する
    • プリロードよりキャッシュしたほうがよいときがあるかも(プリロードしたのをキャッシュするのもアリかも)
  • nginxの設定がムズい
    • locationがマッチする優先度を練習して確認したほうがよさそう

改善点

  • 初動の時間はもう少し短縮できそう(45分くらいかかった。本番は1h以内にやりたい)
  • phpMyAdmin等で、DBの中身を見られるようにしたい
    • 練習中は、Ubuntuにインストールする方法が分からなくて断念しました
  • アプリケーションのプロファイルをとりたい
    • SQLだけだと、どこから発行されたクエリが遅いのか分かりにくいときがある(特に後半)
      • エンドポイントが増えるとなおそうなりそう
    • 強いチームはFlame Graphを見てそうだった
  • ベンチ以外に確認できる手段を用意したい
    • 2つのエンドポイントにリクエストを送って、レスポンスを比較したり
    • 改善のサイクルを早く回せたほうがいいため(ベンチはそれなりに時間がかかる)

まとめ

スコアが伸びるのが面白いです。いい練習方法を見つけたので、また記事にできればと思います。