Slide 1

Slide 1 text

Ruby 3.0 JIT on Rails ۜ࠲Rails#23 Takashi Kokubun / @k0kubun

Slide 2

Slide 2 text

ࣗݾ঺հ • GitHub, Twitter: @k0kubun • Arm Treasure Data • Backend, SRE, API • Ruby ίϛολ • JIT, VM, ERB, Πϯϑϥ, ϕϯνϚʔΫ

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

એ఻

Slide 5

Slide 5 text

એ఻

Slide 6

Slide 6 text

એ఻

Slide 7

Slide 7 text

ࠓ೔࿩͢͜ͱ • Ruby 3.0 JIT ͷݱࡏͷੑೳ • Rails ͰͷϘτϧωοΫͷվળ • C Λ Ruby ʹॻ͖׵͑ͯΔ࿩ • ࠓޙͷ JIT ΞʔΩςΫνϟ

Slide 8

Slide 8 text

Ruby 3.0 JIT ͷݱࡏͷੑೳ

Slide 9

Slide 9 text

mame/optcarrot 3VCZ 3VCZ 3VCZ GSBNFTTFD 7. +*5

Slide 10

Slide 10 text

benchmark-driver/sinatra 3VCZ 3VCZ 3VCZ SFRVFTUTTFD 7. +*5

Slide 11

Slide 11 text

k0kubun/railsbench 3VCZ 3VCZ 3VCZ SFRVFTUTTFD 7. +*5

Slide 12

Slide 12 text

͜Ε·Ͱͷੑೳվળͷ֓ཁ • 2.6: Optcarrot޲্͸ݱঢ়͜ͷόʔδϣϯͷΈɻJIT compaction͸Railsʹޮ͘ɻ • 2.7: Ұ෦ϝιουͷΠϯϥΠϯԽɻmax cacheσϑΥϧτมߋ͸ҰԠRailsʹޮ͘ɻ • 3.0: builtinϝιουͷΠϯϥΠϯԽɻRails޲͚ͷ࠷దԽ͕͍͔ͭ͘ (͜Ε͔Βઆ໌)

Slide 13

Slide 13 text

Rails ͰͷϘτϧωοΫͷվળ

Slide 14

Slide 14 text

Optcarrot ͱ Sinatra, Rails ͷҧ͍͸? • ط஌ͷࣄ࣮: Optcarrot͕଎͘Ͱ͖Δͷ͸Πϯελϯεม਺ͷ࠷దԽ͕ Α͘ޮͨ͘Ί • ͔͠͠ɺSinatra΍Rails͕஗͘ͳΔͷ͸Կނ͔? • CPUͷͲͷϨΠϠʔͰϘτϧωοΫʹͳ͍ͬͯΔ?

Slide 15

Slide 15 text

VTune: mame/optcarrot - VM • VTune: VM, JIT

Slide 16

Slide 16 text

VTune: mame/optcarrot - JIT • VTune: VM, JIT

Slide 17

Slide 17 text

VTune: benchmark-driver/sinatra - VM

Slide 18

Slide 18 text

VTune: benchmark-driver/sinatra - JIT

Slide 19

Slide 19 text

VTune: k0kubun/railsbench - VM

Slide 20

Slide 20 text

VTune: k0kubun/railsbench - JIT

Slide 21

Slide 21 text

ϑϩϯτΤϯυͷׂ߹͕૿͍͑ͯΔ • ໋ྩͷ࣮ߦͰ͸ͳ͘ɺ໋ྩͷfetchͰstall͍ͯ͠Δ • CPU 1αΠΫϧ͋ͨΓʹ࣮ߦ͞ΕΔ໋ྩ਺͕গͳ͍ • VMͷ࣌఺ͰOptcarrotͱ͸͕ࠩ͋Δ͕ɺJITͰѱԽ͍ͯ͠Δͷ͸ ICache Miss

Slide 22

Slide 22 text

Instruction Cache (ICache) Miss ͱ͸ • Α͋͘ΔCPUͷΩϟογϡ: L1i, L1d, L2, L3 (shared) • L1i: Level 1 Instruction Ωϟογϡ • CPU໋ྩͷΩϟογϡϛε • ಉ࣌ʹΞΫηε͢Δίʔυ͕ผͷcacheline΍ϖʔδʹ͋ΔͳͲ (ίʔυͷαΠζ͔ϨΠΞ΢τͷ໰୊)

Slide 23

Slide 23 text

ICache Miss ΛͲ͏ճආ͢Δ͔ • ίʔυαΠζͷ࡟ݮ • ॏෳΛഉআ͢Δ • ࣮ߦ࣌৘ใʹج͍ͮͯෆཁͳύεΛ࡟Δ • ϨΠΞ΢τͷվળ • ϝιου͝ͱʹผϖʔδʹόϥόϥͳͷ͸2.6 JIT compactionͰղܾ • hot path ͷہॴੑΛ্͛Δ

Slide 24

Slide 24 text

ॏෳΛഉআ͢Δ • 3.0 ʹೖͬͨ࠷దԽ: • JIT compactionͰɺ.o Ͱ͸ͳ͘.c͔ΒίϯύΠϧ͠௚͢ (staticؔ਺͕ dedup͞ΕΔ) • ivar͕࠷దԽ͞Εͳ͔ͬͨ࣌ʹ࢖ΘΕΔؔ਺ͷΠϯϥΠϯԽΛ΍ΊΔ • JIT cancel࣌ͷෳ਺ͷؔ਺ݺͼग़͠Λ1ͭʹ·ͱΊΔ

Slide 25

Slide 25 text

࣮ߦ࣌৘ใʹج͍ͮͯෆཁͳύεΛ࡟Δ • 3.0 ʹೖͬͨ࠷దԽ: • ϝιουݺͼग़͠ͰϨγʔόͷΫϥε͕ඇଈ஋ͳΒɺଈ஋޲͚ͷ෼ ذΛআڈ͢Δ

Slide 26

Slide 26 text

hot path ͷہॴੑΛ্͛Δ • 3.0 ʹೖͬͨ࠷దԽ: • ϝιου୳ࡧͳͲͷύεʹcold attributeΛ͚ͭΔ • stackoverflow࣌΋coldԽ • JITίϯύΠϧͷenqueue΋coldԽ

Slide 27

Slide 27 text

͋ͱ͸Ͳ͏͢Δ͔ • ·ͩ஗͘ͳΔݪҼʹͳͬͯͦ͏ͩ͠ɺॏෳ΋͋Γͦ͏ • ͔͠͠୯ʹΠϯϥΠϯԽΛແޮԽ͢ΔͱͦΕͰ஗͘ͳΔ͜ͱ΋͋Δ ͷͰɺ͜ΕҎ্͸৻ॏʹ΍Δඞཁ͕͋Δ • ϝιου͋ͨΓͷίʔυαΠζ͕ҰؾʹݮΕ͹ɺJIT͍͍ͯ͠࠷େϝ ιου਺΋૿΍ͤΔ͔΋

Slide 28

Slide 28 text

C Λ Ruby ʹॻ͖׵͑ͯΔ࿩

Slide 29

Slide 29 text

RubyKaigi 2018

Slide 30

Slide 30 text

RubyKaigi 2019

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

Builtin ϝιουͱ͸ • RubyίΞͷ࣮૷Ͱ͔͠࢖͑ͳ͍ػೳ • ISeqͷόΠφϦঢ়ଶͰอଘ͞Ε͓ͯΓɺϩʔυίετ͕௿͍ • ΩʔϫʔυҾ਺ΛऔΔϝιου͸ɺRubyͰ࣮૷ͨ͠ํ͕ߴ଎ • RubyͰϝιουΛఆٛ͢Δ͕ɺCͷؔ਺͕௿ίετͰݺͼग़ͤΔ

Slide 34

Slide 34 text

Builtin ϝιουͱ͸

Slide 35

Slide 35 text

Builtin attr ͱ͸ • LLVMͳͲͳ͠ͰCͷؔ਺ͷڍಈΛղੳ͢Δͷ͸೉͍͠ • ͦ͜ͰɺϝιουͷಛੑΛΞϊςʔγϣϯ͓͖ͯ͠ɺJIT͸ͦΕΛ৴͡Δ • RubyͷCIͳͲͰΞϊςʔγϣϯ͕ਖ਼͍͔͠͸࣮ߦ࣌ʹݕ͍ࠪͯ͠Δ

Slide 36

Slide 36 text

Builtin attr ͷҰཡ • inline: ϝιουϑϨʔϜΛpush͠ͳͯ͘΋ྑ͍ • ݱঢ়͜Ε͚ͩɻJIT͕ϝιουϑϨʔϜͷpushΛεΩοϓ͍ͯ͠Δ

Slide 37

Slide 37 text

Builtin attr inline Λ͚ͭΔྫ

Slide 38

Slide 38 text

ϝιουϑϨʔϜεΩοϓͷޮՌ ,FSOFMDMBTT JT 7. +*5 +*5 GSBNFTLJQ 1.3x 1.7x

Slide 39

Slide 39 text

ϝιουϑϨʔϜεΩοϓʹҙຯ͸͋Δͷ͔? • Rails͸ϝιουݺͼग़͕͠ଟͦ͏ • ͨͩ͠ɺ͋Δϝιου͋ͨΓͷݺͼग़͠ճ਺͸ͦΕ΄Ͳଟ͘ͳ͘ɺ ΍΍ෆར • Cͷؔ਺ఆٛ͝ͱΠϯϥΠϯԽͨ࣌͠ʹ࠷దԽ࣌ͷϊΠζ͕ݮΔ • 1ճ͋ͨΓ 4ns / 16 clocks ఔ౓ޮՌ͕ݟΒΕΔ

Slide 40

Slide 40 text

ϝιουϑϨʔϜεΩοϓͷ৚݅ • ϝιουݺͼग़͠Λ͠ͳ͍ • ྫ֎Λ౤͛ͳ͍ • TypeError, ArgumentError, NoMemoryError ΋֘౰͢Δ • όοΫτϨʔεΛݟͳ͍

Slide 41

Slide 41 text

ࠓޙͷ JIT ΞʔΩςΫνϟ

Slide 42

Slide 42 text

C2 ΍ Graal ͕ѻ͍ͬͯΔάϥϑ

Slide 43

Slide 43 text

MJIT͕΍͍ͬͯΔ͜ͱ • VMಛ༗ͷΦʔόʔϔουͷআڈ • VM໋ྩ୯ҐͰͷ࣮ߦ࣌৘ใΛ࢖ͬͨ࠷దԽ • ϝιουͷΠϯϥΠϯԽ • ࢒Γͷ࠷దԽ͸CίϯύΠϥ೚ͤ

Slide 44

Slide 44 text

JITʹظ଴͢Δ͜ͱ • ίϯύΠϧ࣌ܭࢉ • Constant folding • Dead code elimination • Loop invariant motion • ϝϞϦΞΫηεͷ࠷దԽ

Slide 45

Slide 45 text

MJIT ͷݶք • CίϯύΠϥ͸ Ruby VM ಛ༗ͷࣄ৘ΛߟྀͰ͖ͳ͍ • ΠϯϥΠϯԽͷൣғʹݶք͕͋Δ (C ϝιου౳) • ΍Γ͗͢ΔͱίʔυαΠζ͕૿͑ٯޮՌ • ਖ਼ৗܥΛ༏ઌͯ͠࠷దԽͤ͞Δͱ͍ͬͨࢦ͕ࣔ೉͍͠

Slide 46

Slide 46 text

ͱ͸͍͑ • JIT ແޮͷ࣌ʹ஗͘ͳΔखஈ͸औΓͨ͘ͳ͍ • JITͰ΋଎͍ͷ͸؆୯ͳίϚϯυͳͲͰศར • ϝϯς͕େมʹͳΔखஈ΋औΓͨ͘ͳ͍ • VM໋ྩ͕૿͑ͯ΋جຊతʹ͸JIT͸ಈ͖ଓ͚ͯཉ͍͠ • VMͷڍಈͱ͸શ͘ಠཱͨ͠ίʔυੜ੒΋ͨ͘͠ͳ͍

Slide 47

Slide 47 text

͡Ό͋Ͳ͏͢Δ͔ 1. ίϯύΠϧ࣌ܭࢉʹඞཁͳ΋ͷΛἧ͑Δ 2. ୯७ͳಠࣗIR͔ΒVMʹ୤࠷దԽ͢Δج൫Λ੔͑Δ 3. ΑΓߴ౓ͳ࠷దԽʹదͨ͠IRߏ଄ʹม͑Δ

Slide 48

Slide 48 text

1. ίϯύΠϧ࣌ܭࢉʹඞཁͳ΋ͷΛἧ͑Δ • CϝιουͷΞϊςʔγϣϯΛ૿΍͢ (Τεέʔϓ͢Δ͔ɺ७ਮ͔) • ࣮ߦ࣌ͷܕ৘ใ͕ΑΓଟ͘ͷ৔ॴͰऔΕΔΑ͏ʹ͢Δ (opt໋ྩͳͲ) • Cϝιου, super, yield, ఆ਺ ͳͲͷΠϯϥΠϯԽରԠΛਐΊΔ

Slide 49

Slide 49 text

2. ୯७ͳಠࣗIR͔ΒVMʹ୤࠷దԽ͢Δج൫ • YARV໋ྩΛJITಠࣗͷIRʹ෼ղՄೳʹ͠ɺ໋ྩ/IRྻʹ࠷దԽΛ͔͚Δ • ࠷దԽͨ͠ޙͷ໋ྩ/IRྻͰ୤࠷దԽ͕ൃੜ͢Δ೚ҙͷ৔ॴ͔ΒVM ࣮ߦʹ໭ͤΔঢ়ଶΛҡ࣋͢Δ • On-Stack Replacement (JIT → VM) ΋ͦͷ͏࣮ͪ૷

Slide 50

Slide 50 text

3. ΑΓߴ౓ͳ࠷దԽʹదͨ͠IRߏ଄ʹม͑Δ • ୤࠷దԽͷج൫͕੔ͬͨΒɺͦΕΛҡ࣋͠ͳ͕Β࠷దԽʹదͨ͠IRά ϥϑʹม͍͑ͯ͘ • ίϯύΠϥ͸Ruby (on Ractor) Ͱ࣮૷͍ͨ͠

Slide 51

Slide 51 text

ߴ౓ͳ࠷దԽͷྫ (ࠓ͸CͰॻ͍͍ͯΔ) • ෳ਺໋ྩؒͰॏෳ͍ͯ͠ΔܕνΣοΫͷϚʔδ (ࠓ೔ॻ͍ͨ) • Optcarrot fps: 83.3 → 93.0

Slide 52

Slide 52 text

ଞʹ΍Γ͍ͨͱࢥ͍ͬͯΔ͜ͱ • ෭࡞༻ͷͳ͍ϝιουͷίϯύΠϧ࣌ݺͼग़͠ • [1, 2].min ͰΞϊςʔγϣϯʹج͍ͯ rb_ary_min ΛίϯύΠϧ࣌ʹݺͼग़͢౳ • Τεέʔϓ͠ͳ͍ΦϒδΣΫτͷࣄલׂΓ౰ͯ • ҎલStringΛελοΫׂ෇͢ΔPoCΛ࡞͕ͬͨɺͦ΋ͦ΋Ξϩέʔγϣϯ͕ͳ ͯ͘ࡁΉ৔߹͸ͦΕ͕࠷଎ • Frozen string literal ͳͲΛෆཁʹ͍ͨ͠

Slide 53

Slide 53 text

·ͱΊ • ࠓ͸JITʹΑΔ࠷దԽ͕ࠔ೉ͳͱ͜Ζͷ଍ճΓΛ੔͍͑ͯΔஈ֊ • Rails͕଎͘Ͱ͖Δ·ͰͷಓͷΓ͸௕͍͕ɺ3.0Ͱ΋ண࣮ʹਐḿ͍ͯ͠Δ