Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RBSのメモリ使用量改善への道
Search
pocke
July 27, 2024
Technology
1
47
RBSのメモリ使用量改善への道
pocke
July 27, 2024
Tweet
Share
More Decks by pocke
See All by pocke
Witchcraft for Memory
pocke
1
3.6k
The path to memory reduction in RBS
pocke
0
45
Community-driven RBS repository
pocke
2
1.4k
Active Record Query Quiz
pocke
1
1.5k
Let's write RBS!
pocke
1
5.1k
RBS and Rails, Present and Future
pocke
1
1.4k
The newsletter of RBS updates
pocke
1
3.4k
kwargs warning → Sentry
pocke
0
340
Ruboty and SKI
pocke
0
230
Other Decks in Technology
See All in Technology
20251014_Pythonを実務で徹底的に使いこなした話
ippei0923
0
190
リセラー企業のテクサポ担当が考える、生成 AI 時代のトラブルシュート 2025
kazzpapa3
1
160
【Kaigi on Rails 事後勉強会LT】MeはどうしてGirlsに? 私とRubyを繋いだRail(s)
joyfrommasara
0
260
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
2
1.3k
スタートアップにおけるこれからの「データ整備」
shomaekawa
2
470
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.2k
BI ツールはもういらない?Amazon RedShift & MCP Server で試みる新しいデータ分析アプローチ
cdataj
0
150
Geospatialの世界最前線を探る [2025年版]
dayjournal
1
220
Vibe Coding Year in Review. From Karpathy to Real-World Agents by Niels Rolland, CEO Paatch
vcoisne
0
140
能登半島地震で見えた災害対応の課題と組織変革の重要性
ditccsugii
0
750
20201008_ファインディ_品質意識を育てる役目は人かAIか___2_.pdf
findy_eventslides
2
630
新規事業におけるGORM+SQLx併用アーキテクチャ
hacomono
PRO
0
250
Featured
See All Featured
Thoughts on Productivity
jonyablonski
70
4.9k
The Language of Interfaces
destraynor
162
25k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
870
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
Build your cross-platform service in a week with App Engine
jlugia
232
18k
Being A Developer After 40
akosma
91
590k
Writing Fast Ruby
sferik
629
62k
The Cult of Friendly URLs
andyhume
79
6.6k
How GitHub (no longer) Works
holman
315
140k
Rails Girls Zürich Keynote
gr2m
95
14k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
Code Reviewing Like a Champion
maltzj
526
40k
Transcript
RBSのメモリ使用量改善 への道 岡山Ruby, Ruby on Rails勉強会 #23
誰 • Pocke • Ruby committer • RBSのメンテナ • 2020年から岡山に住んでいます
Agenda メインのトピックが2つ • ファイル数が多い時に、Steepの実行速度を改善した話 • Ruby向けのメモリプロファイラを作っている話
なぜメモリ使用量の改善が必要なのか
なぜメモリ使用量の改善が必要なのか • Steepはメモリをたくさん使う ◦ LSP Serverとしてプロセスが常駐する ◦ 1プロセスあたり 1.5GB ▪
* LSPが立ち上がっているプロジェクト数 ▪ * CPUの数(並列化するため) • Steepを広く使ってもらうにはメモリ使用量改善が必要
Steepの実行速度を改善した話
Steepの実行速度を改善した話 • Steepのメモリ使用量の改善に取り組んでいたら、その 副産物として実行速度の改善ができた ◦ メモリ使用量の改善はまだ…… • これはこれで面白かったので、紹介します • (来週この内容でブログ記事を公開するよ)
メモリのプロファイリング • SamSaffron/memory_profilerを使う • すべてのメモリの確保と、確保したまま残っているメモ リを表示してくれる
memory_profiler の結果
memory_profiler の結果 set.rbがめちゃくちゃメモリを使っている!
わかった問題 • set.rb がメモリをたくさん確保している ◦ 全体のメモリ確保の70%ぐらいがここで確保されている • これを直せれば問題が解決できるかも!
わかっていないこと • set.rb のコードがどこから呼ばれているのかが分から ない • これがわからないとSteepのどこを直したらよいのかが 分からない
Rubyの雑パッチを書いた https://gist.github.com/pocke/7499e5799856393 b930684ebb905d41c
雑パッチ • MemoryProfilerは ObjectSpace.allocation_sourcefile などを使っ ている • このメソッドが位置情報を取得するところにパッチする ◦ 取得した位置情報がset.rbならば、バックトレースを1つ遡る
雑パッチ
再度memory_profilerを実行
再度memory_profilerを実行 Steepのどこがメモリを確保しているのかわかった!
None
None
None
実行速度の問題が解決された💪 https://github.com/soutaro/steep/pull/1184 でもメモリ使用率はまだ未解決…
新しいメモリプロファイラ
今までの反省点 • メモリ使用量を改善するつもりが、実行速度の改善に なってしまっていた • memory_profilerで正しく問題を捉えられていなかっ た
今までの反省点(2) • memory_profilerで見ていた指標は「すべてのメモリ 確保」 • 一方でメモリ使用量の削減のために知りたいのは「メモ リ使用量がピークの時にメモリを使っているオブジェク ト」 • ここでずれがあった
◦ たくさん確保されてはすぐ消えるオブジェクトがノイズとなっていた
これに対するアプローチ • 長生きしたオブジェクトに絞って、メモリのプロファイ リングをできるとよいのでは • つまり、GCを生き残ったオブジェクトに注目する
メモリプロファイラを作った https://github.com/pocke/majo • GCを1回でも生き残ったオブジェクトだけを集めて集計す るプロファイラ • 一応まともに使えるので、v1.0.0をリリース済み
使ってみた感想 • 出る情報はmemory_profilerと近い ◦ しかし「長生きしたオブジェクト」しか結果に含まれないので、ノイズ がないことがわかるのが大きい ◦ 案外どれが長生きでどれが短命なのかは自明ではない • CSV出力が意外とかなり便利
◦ もしくはスプレッドシートが便利とも言える • memory_profilerに比べると若干高速 ◦ 「全オブジェクト」を対象にするmemory_profilerはかなり遅い ◦ 一方で短命オブジェクトを無視できるMajoは若干マシ
余談(1) memory_profilerのretainedを見るんじゃだめだった の? • retainedを見るにはオブジェクトを生かしておく必要が あり、memory_profilerを差し込む場所を考えるのが むずかしい… • 「メモリ使用量がピークの時」にmemory_profilerを 止めないといけない
余談(2) • https://github.com/ruby/ruby/pull/10598 ◦ RubyのMajor GCだけを止めて、Minor GCのみを動かす機能追加のPR • 最初実現方法を考えている時に、このPRも試せないかな と眺めていた
• 結果としては使わなかったけれど、PRでバグ報告をした りしていい経験になった