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

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

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() ͍͍ͯ͠ͳΒ
 ͦΕͰ΋͍͍