Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
1 今年一番の仕事の成果 2024/11/15 めぐろLT#21 株式会社くふうカンパニー 佐々木陽貴(マグロ)
Slide 2
Slide 2 text
2 ⾃⼰紹介 佐々木陽貴 (sasaki haruki / maguro) 24卒サーバーサイドエンジニア X: @sigumataityouda GitHub: maguro-alternative 最近書く言語 Ruby,TypeScript,Go
Slide 3
Slide 3 text
3 ⾃⼰紹介 携わっているプロダクト 「トクバイ」 全国のスーパーやドラッグストアなどのチラ シが無料で見れるサービス サーバーは Ruby on Railsで構成
Slide 4
Slide 4 text
4 CSV生成バッチのパフォーマンス改善
Slide 5
Slide 5 text
5 CSV⽣成バッチのパフォーマンス改善 CSV⽣成バッチのパフォーマンス改善 ● toB向けに提供していた商品やチラシなどのデータを提供する バッチ。 ● 60~90分かかっていた処理を 14~19分ほどに短縮。
Slide 6
Slide 6 text
6 CSV⽣成バッチのパフォーマンス改善 背景 ● 1時間に1回、FTP形式でデータ提供を行っていた。 ○ つまり作成に 1時間以上かかってはいけない。 ● 作成当初、処理時間は 15分ほどだった。 ● しかし5月ごろから 50分へと増加し、ついに生成に 60分を超え 90分台に突入してしまう。 ● 一旦マシンパワー増強で 50~60分に収めるが ... これやべーぞ ということで改善します
Slide 7
Slide 7 text
7 CSV⽣成バッチのパフォーマンス改善 調査 ● 生成してた csvファイルは 5つ。 ○ shop ○ leaflet ○ product ○ product_classification ○ product_classification_map ● ログをつけて処理時間を計測。
Slide 8
Slide 8 text
8 CSV⽣成バッチのパフォーマンス改善 調査 ● 内訳はこれぐらい。 ○ shop 40s ○ leaflet 2400s ○ product 800s ○ product_classification 20s ○ product_classification_map 200s ● チラシが一番時間がかかっている。 ● 上から順番に作成しているので、並列で作れば解決するので は?
Slide 9
Slide 9 text
9 CSV⽣成バッチのパフォーマンス改善 調査 ● だがやっぱり
Slide 10
Slide 10 text
10 CSV⽣成バッチのパフォーマンス改善 調査 ● チラシに注目してみる ○ shop 40s ○ leaflet 2400s ○ product 800s ○ product_classification 20s ○ product_classification_map 200s
Slide 11
Slide 11 text
11 CSV⽣成バッチのパフォーマンス改善 調査 ● (チラシの部分で )クエリ取得に対して csvへの書き込みに時間 がかかりすぎている。 ○ クエリ0.1秒に対し、 csv書き込みに 100秒以上(約1000倍)
Slide 12
Slide 12 text
12 CSV⽣成バッチのパフォーマンス改善 調査 ● find_in_batchsで分けて読み込むため、クエリだったら若干時 間がかかる。 ● でもcsv書き込みだけでなんでこんなに、、、?どうなってんの?
Slide 13
Slide 13 text
13 CSV⽣成バッチのパフォーマンス改善 調査 ● 画像urlの書き込みで N+1が発生。
Slide 14
Slide 14 text
14 CSV⽣成バッチのパフォーマンス改善 調査 ● 画像urlの書き込みで N+1が発生。 ○ 画像urlの書き込みの際、事前読み込みに含まれていない モデルがあった。 ○ find_in_batchsのバッチサイズごとにクエリが発行。 ■ csvファイルを 1回生成するのに約 4万回ほどクエリ叩か れてた。 ○ チラシのモデルに上記のモデルを追加して対応。
Slide 15
Slide 15 text
15 CSV⽣成バッチのパフォーマンス改善 調査 ● 画像urlの書き込みで N+1が発生 ○ 結果 チラシcsvの作成で約 6割の時間短縮 (約40分→約16分) 全体で約3割の時間短縮
Slide 16
Slide 16 text
16 CSV⽣成バッチのパフォーマンス改善 調査 ● 目標の1時間以内に収めることには成功。 まだチラシcsvの最 適化は終了してな いぜ!!
Slide 17
Slide 17 text
17 CSV⽣成バッチのパフォーマンス改善 調査 ● find_in_batchsでメモリの使用を抑えて csvへ書き込みしてい た。 ○ 直接の原因ではなかったものの、一度に読み取る数を増や せばもっと改善するのでは? ○ バッチサイズを 5倍にして試す。
Slide 18
Slide 18 text
18 CSV⽣成バッチのパフォーマンス改善 調査 ● 結果 ○ 約6割の時間短縮 (約16分→約6分) 全体はついに 20分台へ
Slide 19
Slide 19 text
19 CSV⽣成バッチのパフォーマンス改善 調査 ● もうこれで良くない?でも ...
Slide 20
Slide 20 text
20 CSV⽣成バッチのパフォーマンス改善 調査 ● 商品に注目 ○ shop 40s ○ leaflet 2400s → 385s ○ product 800s ○ product_classification 20s ○ product_classification_map 200s
Slide 21
Slide 21 text
21 CSV⽣成バッチのパフォーマンス改善 調査 ● クエリに対して書き込みに時間がかかりすぎている。 (クエリに対 して約2~3倍) ● またN+1…?
Slide 22
Slide 22 text
22 CSV⽣成バッチのパフォーマンス改善 調査 ● 結果
Slide 23
Slide 23 text
23 CSV⽣成バッチのパフォーマンス改善 調査 ● というのも ○ N+1は発生していない。 (クエリも最適化されている。 ) ○ 商品のcsvの書き込み量がただ多いだけ。 (多い時1つのク エリに対し 4万行) 容量なんと 900MB
Slide 24
Slide 24 text
24 CSV⽣成バッチのパフォーマンス改善 調査 ● これ以上クエリの最適化は望めなさそう。 ○ なので各処理を並列化させて終了。 ○ 約28分→約18分に短縮!
Slide 25
Slide 25 text
25 感想 N+1怖い ● 下手をすると業務に支障を与えることもある Railsのモデルの扱い⽅ちょっとわかった ● モデルの事前読み込みの扱い方がイメージできていなかったた めいい例を体験できた ペアプロが⾮常にありがたかった ● チームに調査や改善手法まで手取り足取り教えていただいた 本当にありがとうございました。