Slide 1

Slide 1 text

Daisuke Aritomo (@osyoyu) / RubyKaigi 2023 follow-up ͪΐͬͱ͍͍ײ͡ͷ
 Ruby ϓϩϑΝΠϥ͕΄͍͠

Slide 2

Slide 2 text

pp @osyoyu • /^͓͠ΐ[͏ʔ]Ώ/ • ࠷ۙͷ໨ඪ: ཮ւۭͷ੍೼ • ۙگ: ஍ٿͷ70%ΛΞϯϩοΫ͠·ͨ͠ • ۭΛͲ͏߈ུ͢Δ͔ߟ͍͑ͯ·͢ • ඈߦػ͔ɺϋϯάάϥΠμʔతͳͷ͔

Slide 3

Slide 3 text

Daisuke Aritomo (@osyoyu) / RubyKaigi 2023 follow-up ͪΐͬͱ͍͍ײ͡ͷ
 Ruby ϓϩϑΝΠϥ͕΄͍͠

Slide 4

Slide 4 text

l؍࡯͕ͦ͜ɺ͢΂ͯͷൃݟͷ伴Ͱ͋Δɻz

Slide 5

Slide 5 text

Š$IBU(15͕Τδιϯͷ΋ͷͱͯ͠঺հͨ͠ɺ͓ͦΒ࣮͘ࡏ͠ͳ͍֨ݴ l؍࡯͕ͦ͜ɺ͢΂ͯͷൃݟͷ伴Ͱ͋Δɻz

Slide 6

Slide 6 text

͓͞Β͍: Ϟνϕʔγϣϯ • ISUCON Ͱ༏উ͢ΔͨΊʹɺRuby ϓϩάϥϜͷϘτϧωοΫΛ
 ޮ཰తʹ୳͔ͨͬͨ͠ • ॳݟͷʢͱͯ΋஗͍ʣWeb ΞϓϦέʔγϣϯΛ౉͞Εͯ • ੍ݶ࣌ؒ8࣌ؒͰύϑΥʔϚϯενϡʔχϯά͍ͯͩ͘͠͞ • ͱ͍͏ڝٕ͕͋ͬͯɺRuby Ͱউ͍ͪͨ • ͦͷͨΊʹ Ruby ͷྑ͍ϓϩϑΝΠϥ͕΄͍͠

Slide 7

Slide 7 text

ͳΜ͔෼͔ͬͨؾʹͳΔ • Stackprof Ͱ࡞ͬͨ Flamegraph ΛݟΔ • ԣ๮͕௕͍ϝιουͷ࣮૷ΛݟͯΈΔ • ผʹͦΜͳʹ஗ͦ͏͡Όͳ͍…… • ͳΔ΄Ͳɺ1ճ͸଎͍͚Ͳɺͨ͘͞Μݺ͹ΕͯΔ͚ͩͳͷ͔ʁ • Ͳ͏͢Ε͹͍͍Μͩʁʁ

Slide 8

Slide 8 text

ͳΜ͔෼͔ͬͨؾʹͳΔ • Flamegraph ΛݟΔ • ԣ๮͕௕͍ϝιουͷ࣮૷ΛݟͯΈΔ • ผʹͦΜͳʹ஗ͦ͏͡Όͳ͍…… • ͳΔ΄Ͳɺ1ճ͸଎͍͚Ͳɺͨ͘͞Μݺ͹ΕͯΔ͚ͩͳͷ͔ʁ • Ͳ͏͢Ε͹͍͍Μͩʁʁ Կ΋Θ͔ͬͯͳ͍ʂʂʂʂʂ

Slide 9

Slide 9 text

Ͳ͏͢Ε͹ྑ͘ͳΔ͔ • ϓϩϑΝΠϧࣗମ • Process/Thread ୯ҐͰऩूͯ͠ɺͦΕͧΕͷ࢓ࣄͿΓΛݟ͍ͨ • CPU Λ࢖ͬͯΔ࣌ؒɺI/O ʹ࢖ͬͯΔ࣌ؒΛਖ਼֬ʹ೺Ѳ͍ͨ͠ • ϏδϡΞϥΠβ • ↑ ʹରԠ͍ͨ͠ • ελοΫʹݶΒͣɺ೚ҙͷΠϕϯτΛه࿥͍ͨ͠ • HTTP ϦΫΤετͳͲ

Slide 10

Slide 10 text

ϓϩϑΝΠϧࣗମ • 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 ʹඞཁͳػೳΛ଍͍ͯ͘͠

Slide 11

Slide 11 text

ϏδϡΞϥΠβ ڊਓͷݞʹ૬৐Γ͠Α͏ • ύϑΥʔϚϯεΛ௒ؤுͬͯΔਓ͕ͨͪྑ͍΋ͷΛ࡞͍ͬͯΔ͸ͣ • ௒ؤுͬͯΔਓͨͪ = Firefox, Chrome ͷਓͨͪ • ͜ΕΛ͍͍ײ͡ʹ׆༻Ͱ͖ͳ͍͔

Slide 12

Slide 12 text

Chrome ui.prefetto.dev

Slide 13

Slide 13 text

Firefox profiler.firefox.com

Slide 14

Slide 14 text

͍͢͝ • ϒϥ΢βͰى͖͍ͯΔ͜ͱΛ͢΂ͯՄࢹԽͰ͖ΔҙࢥΛײ͡Δ • ͔͍͍ͬ͜ʂ • ศརͦ͏ʂ • ͷͰɺޓ׵ͳܗࣜͷϓϩϑΝΠϧΛ Ruby Ͱग़ྗͰ͖ΔΑ͏ʹͨ͠

Slide 15

Slide 15 text

ϓϩϑΝΠϥΛࢼ࡞ͯ͠Έ͍ͯ·͢ 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 Λ࠾༻

Slide 16

Slide 16 text

ϓϩϑΝΠϥΛࢼ࡞ͯ͠Έ͍ͯ·͢ https://github.com/osyoyu/pf2 • ϓϩϑΝΠϦϯά෦ͷΞΠσΞ͕࢐৽ͳΘ͚Ͱ͸ͳ͍ • rb_pro fi le_frames() API Λ֦ு͸͍ͯ͠Δ • ϏδϡΞϥΠβʹ͸ Firefox Pro fi ler Λ࠾༻

Slide 17

Slide 17 text

ྫ୊: Ϛϯσϧϒϩू߹Λฒྻܭࢉ • ڻҟతฒྻԽՄೳ (embarrassingly parallell) Β͍͠ • σʔλͷड͚౉͠ͱ͔͠ͳ͍͍ͯ͘ • ΞϜμʔϧઌੜ׻ت • ͔͠͠ݱ࣮͸ • 1 thread 148.04 seconds 16 threads 147.94 seconds

Slide 18

Slide 18 text

ྫ୊: Ϛϯσϧϒϩू߹Λฒྻܭࢉ • ΁ͦ͝·Έ͍ͨͳόʔ͕͍ͭͯΔ෦෼͕ Thread ͕ GVL Λ͍࣋ͬͯͯ
 ࣮ࡍʹܭࢉΛͰ͖͍ͯΔ෦෼

Slide 19

Slide 19 text

ྫ୊: Ϛϯσϧϒϩू߹Λฒྻܭࢉ ֓؍ɻࡶͳฒྻ࣮૷Ͱ͸ɺͲͷΈͪҰ෦ͷεϨουʹܭࢉ͕ภΔ͜ͱ͕Θ͔Δ

Slide 20

Slide 20 text

Future work • ϦϦʔε • GitHub ʹ͸ҰԠஔ͍ͯΔ͚Ͳɺruby master Ͱ΋ϏϧυͰ͖·ͤΜ • rb_thread_pro fi le_frames() (ruby/ruby#7784) Λ
 Ϛʔδ·Ͱ΋͍͔ͬͯͳ͍ͱ͍͚ͳ͍ • ศརͳػೳͷ௥Ճ • ೚ҙͷλΠϛϯάͰϚʔΧʔΛଧͯΔػೳ • ϒϥ΢βͷ User Timings API (performance.mark) తͳΠϝʔδ • ͍͍ػೳืूத • Stackprof Ҏ֎ʹ΋༗ྗͳϓϩϑΝΠϥ͸طʹ͍͔ͭ͋͘ΔͷͰɺ
 ৽͍͠ͷͱͯ͠ग़͢΂͖͔͸΍΍ߟ͍͑ͯΔ……