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 follo...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
osyoyu
August 19, 2023
Technology
1
520
ちょっといい感じの Ruby プロファイラがほしい (RubyKaigi 2023 follow up)
osyoyu
August 19, 2023
Tweet
Share
More Decks by osyoyu
See All by osyoyu
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
700
Profile and benchmark every change - RubyKaigi 2025
osyoyu
0
96
Regional.rb and the Tokyo Metropolis
osyoyu
0
250
都市伝説バスターズ「WebアプリのボトルネックはDBだから言語の性能は関係ない」 - Kaigi on Rails 2024
osyoyu
29
18k
プロファイラ開発者と見る「推測するな、計測せよ」 - YAPC::Hakodate 2024
osyoyu
7
940
ZigでC拡張を作る 2024 Edition
osyoyu
1
120
Rubyのパフォーマンスプロファイリングの改善 / Enhancing performance profiling for Ruby
osyoyu
2
1.1k
RubyKaigi Decks
osyoyu
0
210
The depths of profiling Ruby - RubyKaigi 2024
osyoyu
3
7.6k
Other Decks in Technology
See All in Technology
Tebiki Engineering Team Deck
tebiki
0
24k
配列に見る bash と zsh の違い
kazzpapa3
3
170
旅先で iPad + Neovim で iOS 開発・執筆した話
zozotech
PRO
0
100
顧客との商談議事録をみんなで読んで顧客解像度を上げよう
shibayu36
0
340
【Ubie】AIを活用した広告アセット「爆速」生成事例 | AI_Ops_Community_Vol.2
yoshiki_0316
1
120
Amazon Bedrock Knowledge Basesチャンキング解説!
aoinoguchi
0
170
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
220
ブロックテーマ、WordPress でウェブサイトをつくるということ / 2026.02.07 Gifu WordPress Meetup
torounit
0
210
20260204_Midosuji_Tech
takuyay0ne
1
160
今こそ学びたいKubernetesネットワーク ~CNIが繋ぐNWとプラットフォームの「フラッと」な対話
logica0419
5
540
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
2
340
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
190
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Practical Orchestrator
shlominoach
191
11k
Making Projects Easy
brettharned
120
6.6k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
Test your architecture with Archunit
thirion
1
2.2k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7k
Designing Powerful Visuals for Engaging Learning
tmiket
0
240
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
140
How STYLIGHT went responsive
nonsquared
100
6k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
50k
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 Ҏ֎ʹ༗ྗͳϓϩϑΝΠϥطʹ͍͔ͭ͋͘ΔͷͰɺ ৽͍͠ͷͱͯ͠ग़͖͔͢ߟ͍͑ͯΔ……