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のモデルの扱い⽅ちょっとわかった ● モデルの事前読み込みの扱い方がイメージできていなかったた めいい例を体験できた ペアプロが⾮常にありがたかった ● チームに調査や改善手法まで手取り足取り教えていただいた 本当にありがとうございました。