社内勉強会のコピペ。
結論
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 にインデックス貼る
- キャッシュとか???
知識としてはふんわり知ってる。実際にやれと言われて一人でできるのか?またそのチューニングの効果を実際に体験したことはあるか?
今回のルール
- 題材は ISUCON7(Docker で動かせる とのことだったので)
- 答え(参加者のブログ、ソースコード)見て OK
- 本番と同じく制限時間は(だいたい)8 時間
リポジトリ
https://github.com/daido1976/isucon7-qualify
環境構築
初回ベンチ
スコア 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 なので情報が多いし、サンプル実装も良いらしい)
関連記事
参考になったブログ
- ISUCON7予選2日目「Railsへの執着はもはや煩悩」で予選通過した - k0kubun's blog
- ISUCON7 予選突破コードをissue & PR付きで大公開! | Wantedly Engineer Blog
- ISUCON7の予選をはてなメンバーで通過してきました | おそらくはそれさえも平凡な日々
- このブログなんとかしたい: ISUCON 7 予選に参加した話
- ISUCON7の予選を突破しました! - abcang’s blog
- ISUCON7予選の上位陣の戦略まとめ - Bit Journey's Tech Blog
- ISUCON7予選を2日目3位で突破した(2017/10/23) - beatsync.net
- ISUCON7予選で81位でした
- ISUCON7 予選に参加した | TRIAL DANCE
- 社内勉強会でISUCON大爆死の話をしたのでスライドも公開した - はのちゃ爆発