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
もうちょっといいRubyプロファイラを作りたい (2025)
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
osyoyu
August 30, 2025
Programming
850
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
August 30, 2025
More Decks by osyoyu
See All by osyoyu
Wi-Fiはどこから来たのか Wi-Fiは何者か Wi-Fiはどこへ行くのか
osyoyu
0
530
Profile and benchmark every change - RubyKaigi 2025
osyoyu
0
170
Regional.rb and the Tokyo Metropolis
osyoyu
0
280
都市伝説バスターズ「WebアプリのボトルネックはDBだから言語の性能は関係ない」 - Kaigi on Rails 2024
osyoyu
29
19k
プロファイラ開発者と見る「推測するな、計測せよ」 - YAPC::Hakodate 2024
osyoyu
7
1k
ZigでC拡張を作る 2024 Edition
osyoyu
1
150
Rubyのパフォーマンスプロファイリングの改善 / Enhancing performance profiling for Ruby
osyoyu
2
1.1k
RubyKaigi Decks
osyoyu
0
250
The depths of profiling Ruby - RubyKaigi 2024
osyoyu
3
8.3k
Other Decks in Programming
See All in Programming
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.7k
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
820
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
620
自作OSでスライド発表する
uyuki234
0
2.8k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.4k
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
140
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.1k
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
140
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
330
Oxlintのカスタムルールの現況
syumai
6
1.2k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
800
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
260
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
6k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
210
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
880
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
How STYLIGHT went responsive
nonsquared
100
6.2k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Abbi's Birthday
coloredviolet
3
8.4k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
240
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Transcript
osyoyu | RubyKaigi 2025 follow up ͏ͪΐͬͱ͍͍ RubyϓϩϑΝΠϥΛ࡞Γ͍ͨ (2025)
pp @osyoyu • Daisuke Aritomo / ༗༑ େี • https://github.com/osyoyu
ຊͷݩωλ Profile and benchmark every change (RubyKaigi 2025) The depths
of profiling Ruby (RubyKaigi 2024)
ͻ͖͖ͭͮRubyϓϩϑΝΠϥ࡞ͬͯ·͢ • ϓϩϑΝΠϥ • ϓϩάϥϜͷ͍ՕॴΛൃݟ͢Δπʔϧ
github.com/osyoyu/pf2 • Rubyͷ "۱ʑ·Ͱ" "ਖ਼֬ʹ" ଌఆ Ͱ͖Δ͜ͱΛࢦ͢ • RubyϑϨʔϜ •
C (Native) ϑϨʔϜ • GVLͷ༗ঢ়گ • Sampling, In-process ͳϓϩϑΝΠϥ ͱͯ͠ઃܭ • ͙͢ΕͨϏδϡΞϥΠζͦͳ͑Δ 2024ͷεϥΠυ
ϏδϡΞϥΠζ εϨου͝ͱͷ༷ࢠͷ τϥοΫ ίʔϧπϦʔ Flamegraph 2024ͷεϥΠυ
Optcarrot with C frames 2024ͷεϥΠυ
࠷ۙͷΈ
None
None
ϓϩϑΝΠϥͷಈͬͯԿʁ
Έᶃ ϝϞϦΛେྔʹফඅ͢Δ ϝϞϦ͕ͨ͘͞Μ͋ΕͲ͏ͱ͍͏͜ͱͳ͍ • 20 MB/s ͙Β͍ͰϝϞϦ͕৯͍ͭͿ͞Ε͍ͯ͘ • •
ಉؔ͡ͷใΛෳճه͠ͳ͍Α͏ʹͨ͠Γ • ಉ͡ελοΫͷใΛෳճه͠ͳ͍Α͏ʹͨ͠Γ • ͪΌΜͱςʔϒϧΛ࡞Δͱී௨ʹղܾ͢Δ • ࣮ͰϥΫΛ͍͚ͯ͠ͳ͍ • ϝϞϦ͕͋;Εͦ͏ʹͳͬͨΒϑΝΠϧʹॻ͖ग़͢ػೳΛ࣮ͯ͠ΈͨΓ
Έᶄ ϓϩϑΝΠϧͯ͠ΔͱσουϩοΫ͢Δ ͪ͜Β࠷ѱ • ͳΜ͔ϋϯά͢Δ • ʮ৽͍͠εϨου͕ੜ·Εͨͱ͖ʹϓϩϑΝΠϧରʹՃ͢ΔʯػೳΛ ༗ޮʹ͢ΔͱɺϥϯμϜʹԿ͔͕σουϩοΫ͢Δ • ࠷ѱ
• ^Z kill -9 %1 ͷೖྗ͕͔ͳΓ͘ͳͬͨ
ෆ҆ఆͳ࣮ΖΖ • ͍Ζ͍Ζͳ߹Ͱ rb_thread_t ͷߏΛίϐϖ ͍ͯ࣋ͬͯ͠Δ • rb_thread_t ͷߏ͕มΘΔͱવյΕΔ •
͍Ζ͍ΖฒྻʹΔͷͰɺΑ͔ͬͯ͘ͳ͍ ··ࡶʹ Mutex ΛೖΕ·ͬͯͨ͘ • વͷใ͍Λड͚Δ #[repr(C)] struct rb_native_thread { _padding_serial: [c_char; 4], // rb_atomic_t _padding_vm: *mut c_int, // struct rb_vm_struct thread_id: rb_nativethread_id_t, // ... } #[repr(C)] struct rb_thread_struct { _padding_lt_node: [c_char; 16], // struct ccan_list_node _padding_self: VALUE, _padding_ractor: *mut c_int, // rb_ractor_t _padding_vm: *mut c_int, // rb_vm_t nt: *mut rb_native_thread, // ...
ϦϥΠτ & ͍ͭͰʹRust͔ΒC • 2ճʢ3ճʁʣͷ࣮ͳͷͰɺલΑΓ໌Β͔ʹચ࿅͞Εͨ • MutexΛ΄ͱΜͲΊͯɺඞཁͳͱ͜Ζ͚ͩϩοΫϑϦʔͳߏʹ • ͋ͱVec૬Λ͏ͷΛΊΒΕͨΓ •
ଟ͍ϦϯάόοϑΝΛॻ͚ͨΓ • ଞʹຯʹ͏Ε͍͜͠ͱ͕ • ruby.h Ͱఏڙ͞ΕΔϚΫϩ͕͑Δʂ • ͕ϥΫʂ • ίϯύΠϧ࣌ʹݕͰ͖Δϛεݮ͚ͬͨͲɺͲ͏ͤ΄΅શ෦unsafeͩͬͨ͠
Έᶅ ͍͍ϓϩϑΝΠϧର͕खݩʹͳ͍ MandelbrotͱRailsΛϓϩϑΝΠϧ͢Δͷ͖ͨ
Έᶅ ͍͍ϓϩϑΝΠϧର͕खݩʹͳ͍ MandelbrotͱRailsΛϓϩϑΝΠϧ͢Δͷ͖ͨ • ࠓ͓͠Ζͦ͏ͳλʔήοτͷΛ2ͭฉ͚ͨͷͰղܾ͠·ͨ͠
Έᶆ ΘΕͯͳ͍ ͦ͏ͩͶ • લड़ͷΑ͏ʹɺ҆ఆͯ͠ͳ͍ػೳ͕ଟ͍͠…… • ͪΌΜͱએͯ͠ͳ͍͠……
ͦΜͳ͜ΜͳͰɺͦΖͦΖ৽όʔδϣϯΛग़͍ͨ͠ • શ໘ϦϥΠτͨ͜͠ͱͰ͔ͳΓ҆ఆͨ͠ͷͰɺϦϦʔε͍ͨ͠Ͱ͢Ͷ • master ʹ͔͠ͳ͍मਖ਼͕େྔʹ͋Δ
None
None
࠷ۙͷ Brendan Greggઌੜʹձͬͨ • ύϑΥʔϚϯεੳͷେՈ • Flame GraphΛൃ໌ͨ͠ਓ • ଞʹେྔͷख๏Λ։ൃ͍ͯ͠Δ
• ϓϩϑΝΠϥʹ͍ͭͯ ͍ΖΜͳΞυόΠεΛΒͬͨ
Brendan Gregg ઌੜͷݴ༿ • Կى͍ͬͯ͜ͳͯ͘ɺ1ʹ1ɺ1ఔͷϓϩϑΝΠϧΛ औ͓ͬͯ͘ͱ͍͍ • Կ͔͕ى͖ͨͱ͖ɺ͍͔ͭΒى͖͔ͨͷௐࠪʹ༗༻ • ͳΔ΄Ͳʙ
• ͲͪΒ͔ͱ͍͏ͱAPM͕ఏڙ͢Δػೳͳؾ͕͢Δ͕ • ࡶʹͦΕΛΕΔπʔϧ͕͍͍͔͋ͬͯ
ʮKernelͷϑϨʔϜݟ͑ͨ΄͏͕͍͍ʯ • Pf2RubyϑϨʔϜͱCϑϨʔϜΛ ߹ͯ͠දࣔ͢Δ͜ͱ͕Ͱ͖Δ • ͦ͜ʹKernelͷϑϨʔϜ (syscallͷઌ) ग़ͨ΄͏͕͍͍Αɺͱ͍͏ • ͪΐͬͱ͏Ε͕͠͞·͔ͩͬͯͳ͍
• eBPFΛΘͳ͍ͱऔΕͳͦ͞͏Ͱ ·ͩख͕ಈ͍ͯͳ͍ 2024ͷεϥΠυ
Flame Scope ࠷ۙͷൃ໌ ࣮ͨ͠ʂ
None
Δ͔ʙ……
ϓϩϑΝΠϥྖҬͰ͋Γͦ͏ͳ՝ཧ • ෛՙͳ wall-time profiling • ຊདྷ I/O Λ࢝ΊͨॠؒͱऴΘͬͨॠ͚ؒͩهͯ͠ɺ ޙ͔Βܭࢉ͢Ε͍͍͕ɺࠓͷ
Ruby ϓϩϑΝΠϥͷଟ͘ "શεϨουʹఆظతʹࠓͬͯΔ͜ͱΛ͍߹Θͤ" ͍ͯ͠Δ • JIT͞Ε͔ͨؔͲ͏͔Γ͍ͨ • YJITYJITͰ perf map Λग़ྗͰ͖Δ͕ɺະJITϝιουݟ͑ͳ͍
ϓϩϑΝΠϥྖҬͰ͋Γͦ͏ͳ՝ཧ • LLM-readable flamegraph • ը૾ͱͯ͠VLMʹಡ·ͤͯ ԿಡΈऔΕ͍ͯͳ͍
ϓϩϑΝΠϥྖҬͰ͋Γͦ͏ͳ՝ཧ • perf, eBPF ରԠ • ී௨ʹ perf ͰϓϩϑΝΠϥऔͬͨͱ͖ʹRubyϑϨʔϜݟ͍ͨ •
͑ʙʙ ຊʹʁʁʁ • Linux Ҏ֎Ͳ͏͢Μͷʁ • ͓ͩͬͯલΒ Mac Ͱ։ൃͯ͠ͳ͍ʁ • WSL Docker (Mac) Ͱ·ͱʹperf͑ͳ͍͚ͲେৎͰ͔͢ʁ • ͳͷͰ͋Μ·Γڵຯͳ͍
େRactor࣌
େ՝ɿRactor ରԠ • rb_profile_frames() શવ Ractor ͷ͜ͱΛڭ͑ͯ͘Εͳ͍ • ϓϩηε֎Ͱͬͯ ruby
ϓϩηεͷϝϞϦΛղऍ͢ΔλΠϓͷ ϓϩϑΝΠϥͰ Ractor ͷ͜ͱΛΔͷ͔ͳΓେมͦ͏ • M:N ʹͳΔͷ͕͔ͳΓΩπ͍
GoOpenJDK͔ΒֶͿ • ॲཧܥʹΑͬͯͱΕΔϓϩϑΝΠϧखஈେ͖͘ҟͳͬͯ͘Δ • ϥϯλΠϜͷͳ͍ݴޠͰϓϩϑΝΠϥΛ֎෦ʹஔ͔͟ΔΛಘͳ͍ • ҰํɺΘΓͱෳࡶͳϥϯλΠϜΛ͍ͬͯΔݴޠ ϓϩϑΝΠϥΛ෦ʹ͕࣋ͪͪ • Go:
runtime/pprof ɺJava: JFR, AsyncGetCallTrace() • ಛʹGoGoroutineͷΈ͕Ractorʹ͍ۙͷͰ ϓϩϑΝΠϥͷߏࢀߟʹͳΔͩΖ͏
CRuby ͷதʹϓϩϑΝΠϥΛೖΕͯ͠·͏͔? ext/profiler ৽ઃ • ݁ہͷͱ͜ΖɺϓϩϑΝΠϥ࣮ߦঢ়ଶΛΩϟϓνϟ͢Δͷ • ϥϯλΠϜ͕͋ΔͳΒɺϥϯλΠϜʹͦͷػೳ͕͋Δͷ͕߹ཧత? • ֎෦ϓϩηεʹ͢Δ͔Βෆ҆ఆͳ
struct ίϐϖ͕ඞཁʹͳΔ • ext/profiler ͱ͔ʹೖΕͯ͠·͏ͷ͕͍͍ͷ͔ͳʔ • ࢼ࡞ͯ͠Έͨͱ͜ΖɺGET_VM() rb_thread_t ͑ͯศར
ࢼ࡞த: Ractor / M:N ରԠ in ext/profiler • Ractor Ҏલʮ1ϓϩηεͰಉ࣌ʹCPUΛ͑Δͷ
1εϨου͚ͩʯͱ͍͏ԾఆΛ͓͚ͨ ※ GVLΛख์͢C֦ு͜͜Ͱແࢹ • Ractor ͰͦͷԾఆ่͕ΕΔ • Χʔωϧ͔Βʮϓϩηε͕CPU timeΛ10 msͬͨʯ௨Λ ड͚औͬͨͱ͖ɺͦΕ͕ͲͷΧʔωϧεϨουɾRuby ThreadʹΑΔͷ͔ ࣝผͰ͖ͳ͍ͱ͍͚ͳ͍ େ Ractor ࣌
ࢼ࡞த: Ractor / M:N ରԠ in ext/profiler • Linux Ͱ
timer_create(CLOCK_THREAD_CPUTIME_ID) Λ͏͜ͱͰ ΧʔωϧεϨου୯ҐͰফඅͨ͠CPU࣌ؒΛτϥοΩϯάͰ͖Δ • ͔͠͠ΧʔωϧεϨουͱRuby ThreadͷରԠC APIͰެ։͞Ε͍ͯͳ͍ Kernel Thread 1 Ruby Thread KT 2 RT RT RT KT 2 ͕͋ΔॠؒʹͲͷ RT Λ࣮ߦ͍͔ͯͨ͠ ϓϩϑΝΠϥͱͯ͠Γ͍ͨ
͜Μͳײ͡ʹͳΓͦ͏? • Native Thread ͝ͱʹΧʔωϧλΠϚʔΛઃఆ͢Δ • ϓϩϑΝΠϥ͕ىಈͨ͠ͱ͖ͱɺͦͷޙεϨου͕৽نʹىಈͨ͠ͱ͖ʹ ઃఆ • thread_sched_switch
Ͱ Ractor ؒͷεϨουͷҠಈΛه͢Δ • ͱࢥ͚ͬͨͲɺγάφϧϋϯυϥͰ GET_RACTOR() ͍͍ͯ͠ͳΒ ͦΕͰ͍͍
ͱ͍͏Θ͚Ͱ • ແͳվળΛਐΊ͍ͯ·͢ • ͦΕͦ͏ͱ Ruby 3.5 ʹ͚ͯɺCRuby ʹϓϩϑΝΠϥΛઃஔ͢Δ Ξϓϩʔν͕ݱ࣮త͔͔֬ΊΑ͏ͱ͍ͯ͠·͢