Upgrade to Pro — share decks privately, control downloads, hide ads and more …

もうちょっといいRubyプロファイラを作りたい (2025)

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for osyoyu osyoyu
August 30, 2025

もうちょっといいRubyプロファイラを作りたい (2025)

Avatar for osyoyu

osyoyu

August 30, 2025
Tweet

More Decks by osyoyu

Other Decks in Programming

Transcript

  1. github.com/osyoyu/pf2 • Rubyͷ "۱ʑ·Ͱ" "ਖ਼֬ʹ" ଌఆ
 Ͱ͖Δ͜ͱΛ໨ࢦ͢ • RubyϑϨʔϜ •

    C (Native) ϑϨʔϜ • GVLͷ઎༗ঢ়گ • Sampling, In-process ͳϓϩϑΝΠϥ ͱͯ͠ઃܭ • ͙͢ΕͨϏδϡΞϥΠζ΋ͦͳ͑Δ 2024ͷεϥΠυ
  2. ೰Έᶃ ϝϞϦΛେྔʹফඅ͢Δ ϝϞϦ͕ͨ͘͞Μ͋Ε͹Ͳ͏ͱ͍͏͜ͱ͸ͳ͍ • 20 MB/s ͙Β͍ͰϝϞϦ͕৯͍ͭͿ͞Ε͍ͯ͘ • ՗྽ •

    ಉؔ͡਺ͷ৘ใΛෳ਺ճه࿥͠ͳ͍Α͏ʹͨ͠Γ • ಉ͡ελοΫͷ৘ใΛෳ਺ճه࿥͠ͳ͍Α͏ʹͨ͠Γ • ͪΌΜͱςʔϒϧΛ࡞Δͱී௨ʹղܾ͢Δ • ࣮૷ͰϥΫΛͯ͠͸͍͚ͳ͍ • ϝϞϦ͕͋;Εͦ͏ʹͳͬͨΒϑΝΠϧʹॻ͖ग़͢ػೳΛ࣮૷ͯ͠ΈͨΓ
  3. ෆ҆ఆͳ࣮૷΋Ζ΋Ζ • ͍Ζ͍Ζͳ౎߹Ͱ 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, // ...
  4. ϦϥΠτ & ͍ͭͰʹRust͔ΒC΁ • 2ճ໨ʢ3ճ໨ʁʣͷ࣮૷ͳͷͰɺલΑΓ໌Β͔ʹચ࿅͞Εͨ • MutexΛ΄ͱΜͲ΍Ίͯɺඞཁͳͱ͜Ζ͚ͩϩοΫϑϦʔͳߏ଄ʹ • ͋ͱ͸Vec૬౰Λ࢖͏ͷΛ΍ΊΒΕͨΓ •

    ଟ෼଎͍ϦϯάόοϑΝΛॻ͚ͨΓ • ଞʹ΋஍ຯʹ͏Ε͍͜͠ͱ͕ • ruby.h Ͱఏڙ͞ΕΔϚΫϩ͕࢖͑Δʂ • ഑෍͕ϥΫʂ • ίϯύΠϧ࣌ʹݕ஌Ͱ͖Δϛε͸ݮ͚ͬͨͲɺͲ͏ͤ΄΅શ෦unsafeͩͬͨ͠
  5. ϓϩϑΝΠϥྖҬͰ͋Γͦ͏ͳ՝୊੔ཧ • ௿ෛՙͳ wall-time profiling • ຊདྷ͸ I/O Λ࢝ΊͨॠؒͱऴΘͬͨॠ͚ؒͩه࿥ͯ͠ɺ
 ޙ͔Βܭࢉ͢Ε͹͍͍͕ɺࠓͷ

    Ruby ϓϩϑΝΠϥͷଟ͘͸
 "શεϨουʹఆظతʹࠓ΍ͬͯΔ͜ͱΛ໰͍߹Θͤ" ͍ͯ͠Δ • JIT͞Εͨؔ਺͔Ͳ͏͔஌Γ͍ͨ • YJIT͸YJITͰ perf map Λग़ྗͰ͖Δ͕ɺະJITϝιου͸ݟ͑ͳ͍
  6. ϓϩϑΝΠϥྖҬͰ͋Γͦ͏ͳ՝୊੔ཧ • perf, eBPF ରԠ • ී௨ʹ perf ͰϓϩϑΝΠϥऔͬͨͱ͖ʹRubyϑϨʔϜ΋ݟ͍ͨ •

    ͑ʙʙ ຊ౰ʹʁʁʁ • Linux Ҏ֎Ͳ͏͢Μͷʁ • ͓ͩͬͯલΒ Mac Ͱ։ൃͯ͠ͳ͍ʁ • WSL ΍ Docker (Mac) Ͱ͸·ͱ΋ʹperf࢖͑ͳ͍͚Ͳେৎ෉Ͱ͔͢ʁ • ͳͷͰ͋Μ·Γڵຯͳ͍
  7. େ՝୊ɿRactor ରԠ • rb_profile_frames() ͸શવ Ractor ͷ͜ͱΛڭ͑ͯ͘Εͳ͍ • ϓϩηε֎Ͱ૸ͬͯ ruby

    ϓϩηεͷϝϞϦΛղऍ͢ΔλΠϓͷ
 ϓϩϑΝΠϥͰ Ractor ͷ͜ͱΛ஌Δͷ΋͔ͳΓେมͦ͏ • M:N ʹͳΔͷ͕͔ͳΓΩπ͍
  8. ࢼ࡞த: Ractor / M:N ରԠ in ext/profiler • Ractor Ҏલ͸ʮ1ϓϩηεͰಉ࣌ʹCPUΛ࢖͑Δͷ͸


    1εϨου͚ͩʯͱ͍͏ԾఆΛ͓͚ͨ
 ※ GVLΛख์͢C֦ு͸͜͜Ͱ͸ແࢹ • Ractor Ͱ͸ͦͷԾఆ่͕ΕΔ • Χʔωϧ͔Βʮϓϩηε͕CPU timeΛ10 ms࢖ͬͨʯ௨஌Λ
 ड͚औͬͨͱ͖ɺͦΕ͕ͲͷΧʔωϧεϨουɾRuby ThreadʹΑΔ΋ͷ͔
 ࣝผͰ͖ͳ͍ͱ͍͚ͳ͍ େ Ractor ࣌୅
  9. ࢼ࡞த: 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 Λ࣮ߦ͍͔ͯͨ͠ ϓϩϑΝΠϥͱͯ͠͸஌Γ͍ͨ
  10. ͜Μͳײ͡ʹͳΓͦ͏? • Native Thread ͝ͱʹΧʔωϧλΠϚʔΛઃఆ͢Δ • ϓϩϑΝΠϥ͕ىಈͨ͠ͱ͖ͱɺͦͷޙεϨου͕৽نʹىಈͨ͠ͱ͖ʹ
 ઃఆ • thread_sched_switch

    Ͱ Ractor ؒͷεϨουͷҠಈΛه࿥͢Δ • ͱࢥ͚ͬͨͲɺγάφϧϋϯυϥ಺Ͱ GET_RACTOR() ͍͍ͯ͠ͳΒ
 ͦΕͰ΋͍͍