Note

3年後の自分のために書いています

ISUCON 過去問やってみた話

社内勉強会のコピペ。


結論

ISUCON の過去問やって自分の無力さを思い知った話です

:@daido1976: @daido1976

  • 2018/04〜 :feed: Feedforce Inc.
  • パフォーマンスチューニングできるようになりたい

ISUCON とは

Iikanjini Speed Up Contest

See. https://www.google.com/search?q=isucon+%E3%81%A8%E3%81%AF

アプリケーションの仕様は変えずに Web アプリケーションのパフォーマンスをチューニングするコンテスト

パフォーマンスチューニング?

サーバ側なら、

  • n+1 クエリの解決
  • DB にインデックス貼る
  • キャッシュとか???

知識としてはふんわり知ってる。実際にやれと言われて一人でできるのか?またそのチューニングの効果を実際に体験したことはあるか?

今回のルール

リポジトリ

https://github.com/daido1976/isucon7-qualify

環境構築

  • Docker で一発のはずなのに、ベンチマークが動かず 1 日ハマる
  • やたらとベンチマークのコードを読むも分からず
  • 結論、DB に初期データが入ってなかった :innocent:

初回ベンチ

スコア 4000 前後

チューニング開始まで

  • 自分の書いたコードに差し替えて開発できるようになるまでに半日ハマる(https://github.com/isucon/isucon7-qualify をクローンするような Dockerfile になってる)
  • ほとんど Docker 力のなさによるもの

Ruby アップグレード

スコア変わらず

Ruby 2.4.2 -> 2.6.6(2.7.2 まで上げると bundler のバージョンでエラーが出たのでやめた、多分 Dockerfile の中で bundler をインストールしなおせば解決するやつ)

nginx に Cache-Control public; を追加

:github: Add Cache-Control public to nginx.conf

ここからがスコアを上げるための施策(チューニング開始)

スコア変わらず

これってローカル Docker で動かすベンチマーク(Go の HTTP クライアント)でも効くのか?CDN なら物理的な近さで早いの分かるけどローカルなら意味ない?

DB にバイナリで突っ込まれている icon 画像をファイルに書き出して nginx で配信するようにした

スコア4946 まで上がった、でも安定しない、これもローカルではあんまり効かないとか? そういえば画像をバイナリで DB に突っ込むのやめましょうってよくいうけどなんで?容量を取られるの分かるけど、ストレージも RDB でもバイナリの読み書きするなら速度的には変わらないのでは???

n+1 の解決(GET /message

:github: Resolve N+1 in GET /message

GET /fetch の sleep 消した

:github: Remove sleep in GET /fetch

スコア 18056、ここでグッと上がった。

n+1 の解決(GET /history/:channel_id

スコア 19357、GET /message とほぼ同じ。無論共通化などしている余裕はない。

:github: Resolve N+1 in GET /history/:channel_id

message テーブルの channel_id にインデックス追加

スコア 37783、グッと上がった。何度かやるとスコアは激しく(1 万点ぐらい)上下する、原因が分からない…

:github: message テーブルにインデックス貼る

結果

ここまでやって 100 位ぐらい

See. https://isucon.net/archives/50961437.html

次回やりたいこと

  • ボトルネックを見つけるのが一番重要なので次回はそこから(プロファイリングツールなど使って)
  • isucon9 が良問らしいのでやりたい
  • Go でやる(参加者のほとんどが Go なので情報が多いし、サンプル実装も良いらしい)

関連記事

参考になったブログ