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 プロファイラがほしい (RubyKaigi 2023 follow up)
Search
osyoyu
August 19, 2023
Technology
1
220
ちょっといい感じの Ruby プロファイラがほしい (RubyKaigi 2023 follow up)
osyoyu
August 19, 2023
Tweet
Share
More Decks by osyoyu
See All by osyoyu
The depthes of profiling Ruby - RubyKaigi 2024
osyoyu
0
220
今年のRubyKaigiはProfiler Year🤘
osyoyu
0
600
令和最新版 Ruby プロファイラ "Pf2" のご紹介
osyoyu
0
190
Hacking and Profiling Ruby for Performance - RubyKaigi 2023
osyoyu
0
74
隣の API のデータを Rails らしく、しなやかに扱う / Handling next-door API data in Rails
osyoyu
0
250
Other Decks in Technology
See All in Technology
TypeScript の抽象構文木を用いた、数百を超える API の大規模リファクタリング戦略
yanaemon
6
1.3k
Password cracking: past, present, future
openwall
0
300
RailsConf 2024 Keynote "Startups on Rails in 2024"
irinanazarova
0
830
B2C、B2B プロダクトマネジメントの違い(および思考の罠) / B2C, B2B PM and reduction fallacy
ykmc09
5
2.5k
ワールドカフェ再び、そしてロール・ツール群の開発 / World Café Again, and Development of Suites of Roles and Tools
ks91
PRO
0
120
20240516 OpenID TechNight Vol.21 「OIDFシェアードシグナルフレームワーク(ID2)を利用してリアルタイムでセキュリティシグナルを共有するための最新情報」
oidfj
0
170
Dungeons and Dragons and Rails
joelq
0
260
生成AIがもたらす変革 / GitHubGalaxy_CyberAgent
cyberagentdevelopers
PRO
2
170
AWS CLIの起動が重くてつらいので aws-sdk-client-go を書いた / kamakura.go#6
fujiwara3
6
3.4k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
5
38k
TypescriptでのContextualな構造化ロギングと社内全体への導入
leveragestech
3
610
パフォーマンス最適化のベストプラクティス
databricksjapan
0
210
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
155
14k
Thoughts on Productivity
jonyablonski
60
3.9k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
A Philosophy of Restraint
colly
197
16k
Stop Working from a Prison Cell
hatefulcrawdad
266
19k
Designing the Hi-DPI Web
ddemaree
276
33k
How to name files
jennybc
65
94k
Building a Scalable Design System with Sketch
lauravandoore
457
32k
What the flash - Photography Introduction
edds
64
11k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
126
32k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
Gamification - CAS2011
davidbonilla
77
4.6k
Transcript
Daisuke Aritomo (@osyoyu) / RubyKaigi 2023 follow-up ͪΐͬͱ͍͍ײ͡ͷ Ruby ϓϩϑΝΠϥ͕΄͍͠
pp @osyoyu • /^͓͠ΐ[͏ʔ]Ώ/ • ࠷ۙͷඪ: ւۭͷ੍ • ۙگ: ٿͷ70%ΛΞϯϩοΫ͠·ͨ͠
• ۭΛͲ͏߈ུ͢Δ͔ߟ͍͑ͯ·͢ • ඈߦػ͔ɺϋϯάάϥΠμʔతͳͷ͔
Daisuke Aritomo (@osyoyu) / RubyKaigi 2023 follow-up ͪΐͬͱ͍͍ײ͡ͷ Ruby ϓϩϑΝΠϥ͕΄͍͠
l؍͕ͦ͜ɺͯ͢ͷൃݟͷ伴Ͱ͋Δɻz
$IBU(15͕Τδιϯͷͷͱͯ͠հͨ͠ɺ͓ͦΒ࣮͘ࡏ͠ͳ͍֨ݴ l؍͕ͦ͜ɺͯ͢ͷൃݟͷ伴Ͱ͋Δɻz
͓͞Β͍: Ϟνϕʔγϣϯ • ISUCON Ͱ༏উ͢ΔͨΊʹɺRuby ϓϩάϥϜͷϘτϧωοΫΛ ޮతʹ୳͔ͨͬͨ͠ • ॳݟͷʢͱ͍ͯʣWeb ΞϓϦέʔγϣϯΛ͞Εͯ
• ੍ݶ࣌ؒ8࣌ؒͰύϑΥʔϚϯενϡʔχϯά͍ͯͩ͘͠͞ • ͱ͍͏ڝٕ͕͋ͬͯɺRuby Ͱউ͍ͪͨ • ͦͷͨΊʹ Ruby ͷྑ͍ϓϩϑΝΠϥ͕΄͍͠
ͳΜ͔͔ͬͨؾʹͳΔ • Stackprof Ͱ࡞ͬͨ Flamegraph ΛݟΔ • ԣ͕͍ϝιουͷ࣮ΛݟͯΈΔ • ผʹͦΜͳʹͦ͏͡Όͳ͍……
• ͳΔ΄Ͳɺ1ճ͍͚Ͳɺͨ͘͞ΜݺΕͯΔ͚ͩͳͷ͔ʁ • Ͳ͏͢Ε͍͍Μͩʁʁ
ͳΜ͔͔ͬͨؾʹͳΔ • Flamegraph ΛݟΔ • ԣ͕͍ϝιουͷ࣮ΛݟͯΈΔ • ผʹͦΜͳʹͦ͏͡Όͳ͍…… • ͳΔ΄Ͳɺ1ճ͍͚Ͳɺͨ͘͞ΜݺΕͯΔ͚ͩͳͷ͔ʁ
• Ͳ͏͢Ε͍͍Μͩʁʁ ԿΘ͔ͬͯͳ͍ʂʂʂʂʂ
Ͳ͏͢Εྑ͘ͳΔ͔ • ϓϩϑΝΠϧࣗମ • Process/Thread ୯ҐͰऩूͯ͠ɺͦΕͧΕͷࣄͿΓΛݟ͍ͨ • CPU ΛͬͯΔ࣌ؒɺI/O ʹͬͯΔ࣌ؒΛਖ਼֬ʹѲ͍ͨ͠
• ϏδϡΞϥΠβ • ↑ ʹରԠ͍ͨ͠ • ελοΫʹݶΒͣɺҙͷΠϕϯτΛه͍ͨ͠ • HTTP ϦΫΤετͳͲ
ϓϩϑΝΠϧࣗମ • Process/Thread ୯ҐͰऩूͯ͠ɺͦΕͧΕͷࣄͿΓΛݟ͍ͨ • طଘͷ API (rb_pro fi le_frames())
GVL Λ͍࣋ͬͯΔ Thread ͷ ͜ͱ͚ͩڭ͑ͯ͘ΕΔ • ҙͷ Thread ͷใΛऔΕΔ৽ API ΛೖΕ͍ͨ (ruby/ruby#7784) • CPU ΛͬͯΔ࣌ؒɺI/O ʹͬͯΔ࣌ؒΛਖ਼֬ʹѲ͍ͨ͠ • Ruby 3.2 Ͱೖͬͨ hook (RUBY_INTERNAL_THREAD_EVENT_*) ͰͱΕΔ Ruby ʹඞཁͳػೳΛ͍ͯ͘͠
ϏδϡΞϥΠβ ڊਓͷݞʹ૬Γ͠Α͏ • ύϑΥʔϚϯεΛؤுͬͯΔਓ͕ͨͪྑ͍ͷΛ࡞͍ͬͯΔͣ • ؤுͬͯΔਓͨͪ = Firefox, Chrome ͷਓͨͪ
• ͜ΕΛ͍͍ײ͡ʹ׆༻Ͱ͖ͳ͍͔
Chrome ui.prefetto.dev
Firefox profiler.firefox.com
͍͢͝ • ϒϥβͰى͖͍ͯΔ͜ͱΛͯ͢ՄࢹԽͰ͖ΔҙࢥΛײ͡Δ • ͔͍͍ͬ͜ʂ • ศརͦ͏ʂ • ͷͰɺޓͳܗࣜͷϓϩϑΝΠϧΛ Ruby
Ͱग़ྗͰ͖ΔΑ͏ʹͨ͠
ϓϩϑΝΠϥΛࢼ࡞ͯ͠Έ͍ͯ·͢ https://github.com/osyoyu/pf2 • ඪʮใΛͰ͖Δ͚ͩूͰ͖ΔϓϩϑΝΠϥʯ • ϓϩϑΝΠϦϯά෦ rb_pro fi le_frames() API
Λͪΐͬͱ֦ு • (rb_thread_pro fi le_frames() (ruby/ruby#7784) ͕ͳ͍طଘͷ Ruby Ͱಈ͖·ͤΜ…… ͳͷͰϦϦʔεͯ͠·ͤΜ……) • ϏδϡΞϥΠβʹ Firefox Pro fi ler Λ࠾༻
ϓϩϑΝΠϥΛࢼ࡞ͯ͠Έ͍ͯ·͢ https://github.com/osyoyu/pf2 • ϓϩϑΝΠϦϯά෦ͷΞΠσΞ͕৽ͳΘ͚Ͱͳ͍ • rb_pro fi le_frames() API Λ֦ு͍ͯ͠Δ
• ϏδϡΞϥΠβʹ Firefox Pro fi ler Λ࠾༻
ྫ: Ϛϯσϧϒϩू߹Λฒྻܭࢉ • ڻҟతฒྻԽՄೳ (embarrassingly parallell) Β͍͠ • σʔλͷड͚͠ͱ͔͠ͳ͍͍ͯ͘ •
ΞϜμʔϧઌੜت • ͔͠͠ݱ࣮ • 1 thread 148.04 seconds 16 threads 147.94 seconds
ྫ: Ϛϯσϧϒϩू߹Λฒྻܭࢉ • ͦ͝·Έ͍ͨͳόʔ͕͍ͭͯΔ෦͕ Thread ͕ GVL Λ͍࣋ͬͯͯ ࣮ࡍʹܭࢉΛͰ͖͍ͯΔ෦
ྫ: Ϛϯσϧϒϩू߹Λฒྻܭࢉ ֓؍ɻࡶͳฒྻ࣮ͰɺͲͷΈͪҰ෦ͷεϨουʹܭࢉ͕ภΔ͜ͱ͕Θ͔Δ
Future work • ϦϦʔε • GitHub ʹҰԠஔ͍ͯΔ͚Ͳɺruby master ͰϏϧυͰ͖·ͤΜ •
rb_thread_pro fi le_frames() (ruby/ruby#7784) Λ Ϛʔδ·Ͱ͍͔ͬͯͳ͍ͱ͍͚ͳ͍ • ศརͳػೳͷՃ • ҙͷλΠϛϯάͰϚʔΧʔΛଧͯΔػೳ • ϒϥβͷ User Timings API (performance.mark) తͳΠϝʔδ • ͍͍ػೳืूத • Stackprof Ҏ֎ʹ༗ྗͳϓϩϑΝΠϥطʹ͍͔ͭ͋͘ΔͷͰɺ ৽͍͠ͷͱͯ͠ग़͖͔͢ߟ͍͑ͯΔ……