Slide 1

Slide 1 text

CίϯύΠϥΛར༻ͨ͠ RubyͷJITίϯύΠϥ ࠃ෼ਸࢤ / Arm Treasure Data ୈ60ճ ϓϩάϥϛϯά γϯϙδ΢Ϝ

Slide 2

Slide 2 text

ࣗݾ঺հ • ࠃ෼ ਸࢤ (@k0kubun) • ॴଐ: τϨδϟʔσʔλגࣜձࣾ (Arm͕ങऩ) • Rubyίϛολʔ 3೥໨ • JITίϯύΠϥΛ։ൃ • ςϯϓϨʔτΤϯδϯͷϝϯςφ

Slide 3

Slide 3 text

LLRB - LLVMϕʔεͷRubyͷJIT

Slide 4

Slide 4 text

Ruby 2.6ͰͷJIT։ൃ

Slide 5

Slide 5 text

ΞδΣϯμ • RubyͷJITख๏ͷ֓ཁ • ར఺ɺܽ఺ɺ࣮ݱՄೳͳ࠷దԽྫ • ੑೳධՁ

Slide 6

Slide 6 text

RubyͷJITख๏ͷ֓ཁ

Slide 7

Slide 7 text

RubyͱJITʹ͍ͭͯ • Ruby: ಈతܕ෇͚ͷΦϒδΣΫτࢦ޲εΫϦϓτݴޠ • ελοΫϕʔεͷόΠτίʔυΛ࣋ͭVirtual Machine • JITίϯύΠϧ: ࣮ߦ࣌ίϯύΠϧ • ຊൃදͰ͸ɺRuby VMͷόΠτίʔυͷ͔ΘΓʹɺJITͰੜ੒ ͨ͠ػցޠΛݺͼग़͢͜ͱͰ࠷దԽ͢Δ໨తʹ࢖͏

Slide 8

Slide 8 text

RubyʹJITΛಋೖ͢Δഎܠͱ໨త എܠ: • Ruby͸WebΞϓϦέʔγϣϯʹΑ͘࢖ΘΕΔ ໨త: • WebΞϓϦέʔγϣϯαʔόʔͳͲ௕ظ࣮ߦ͢Δϓϩ άϥϜͰੑೳΛ্͛ɺϢʔβʔମݧΛ޲্ͤͨ͞Γɺ αʔόʔ୆਺ΛݮΒͨ͠Γ͍ͨ͠

Slide 9

Slide 9 text

ຊख๏ͷ֓ཁ • ΠϯλϓϦλىಈ࣌ʹJIT༻ͷεϨουΛىಈ • Ruby 2.6ͷ࣌఺Ͱ͸σϑΥϧτͰͳ͍ͷͰɺཁ --jit • ϝΠϯͷεϨουͰ5ճҎ্ݺͼग़͞Εͨϝιου͕ Ωϡʔʹੵ·ΕΔ • JIT༻ͷεϨου͕ϝιου୯ҐͰόΠτίʔυΛػցޠ ʹίϯύΠϧ

Slide 10

Slide 10 text

ຊख๏ͷ֓ཁ 1. όΠτίʔυΛCͷίʔυʹม׵ + CͷϨϕϧͰ࠷దԽ 2. σΟεΫ (/tmp) ʹ .c ͷϑΝΠϧΛॻ͖ग़͢ 3. RubyΠϯλϓϦλ͕࣮ߦ࣌ʹCίϯύΠϥϓϩηεΛىಈ 4. ੜ੒ͨ͠ .so ϑΝΠϧΛಈతϩʔυ 5. όΠτίʔυͷ୅ΘΓʹϩʔυͨؔ͠਺ΛݺͿΑ͏ʹมߋ

Slide 11

Slide 11 text

ຊख๏ͷ֓ཁ

Slide 12

Slide 12 text

ຊख๏ͷ֓ཁ

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

RubyͷJITख๏ͷར఺

Slide 15

Slide 15 text

ར఺ 1: ΞηϯϒϦίʔυੜ੒͔Βͷ։์ • ؆୯: ςϯϓϨʔτΤϯδϯͰಈతͳCίʔυੜ੒ • VMΛ࣮૷͢Δ͚ͩͰσϑΥϧτͷJIT࣮૷Λࣗಈੜ੒Ͱ͖Δ • ϙʔλϒϧ: ΠϯλϓϦλ͕ϏϧυͰ͖Δ؀ڥͰ͸࢖͑Δ͸ͣ • Cͷ࢓༷͕มΘΒͳ͍ͷͰLLVMͷΑ͏ʹඇޓ׵ʹৼΓճ͞Εͳ͍

Slide 16

Slide 16 text

ར఺ 2: σόοΨΛ࢖ͬͨղੳίετͷ௿Լ • gdb౳Ͱσόοά͢ΔࡍɺVMͷ࣮૷ͱಉ͡C͚ͩΛݟΔ͜ ͱʹͳΔ • ίʔυੜ੒͕ࣗલͳΒɺσόοά৘ใೖΕΔͷ΋ࣗલʹͳ Γେมͦ͏

Slide 17

Slide 17 text

ར఺ 3: ௿ϨΠϠʔͷ࠷దԽͷ CίϯύΠϥ΁ͷҠৡ • ༷ʑͳ࠷దԽςΫχοΫΛ࠶ൃ໌͢ΔϦιʔε͸ͳ͍ • ੜ੒ίʔυ͔ΒVMͷؔ਺Λ༰қʹΠϯϥΠϯԽՄೳ

Slide 18

Slide 18 text

ར఺ 4: ෳ਺ͷίϯύΠϥج൫͕׆༻Մೳ • GCCͱClang/LLVMͷ྆ํ͕ར༻ՄೳͰɺVisual Studioʹ ΋ରԠ • ΍Ζ͏ͱࢥ͑͹LLVM PassΛࣗ࡞ͯ͠ opt(1) ͔Β࢖͑Δ ͔΋͠Εͳ͍

Slide 19

Slide 19 text

RubyͷJITख๏ͷܽ఺

Slide 20

Slide 20 text

ܽ఺ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ Φʔόʔϔου • dlopen ͢Δͱ֤ϝιου(.soϑΝΠϧ)͕3ͭͷϖʔδʹ෼ׂ ͞Εͯϩʔυ͞ΕɺΩϟογϡʹѱӨڹ • ͳͷͰɺޙͰෳ਺ͷϝιουΛ·ͱΊͯ࠶ίϯύΠϧ͍ͯ͠ Δ͕ɺ໘౗

Slide 21

Slide 21 text

ܽ఺ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ Φʔόʔϔου ৄࡉ: http://shinh.hatenablog.com/entry/2018/06/10/235314

Slide 22

Slide 22 text

ܽ఺ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ Φʔόʔϔου https://github.com/ruby/ruby/pull/1921

Slide 23

Slide 23 text

ܽ఺ 2: ࣮ߦ࣌ґଘͷෳࡶԽ - CίϯύΠϥ • ͜Ε·ͰɺCίϯύΠϥ͸ΠϯλϓϦλ͔Β࣮ߦՄೳͳඞ ཁ͸ͳ͔ͬͨ • ϓϦίϯύΠϧυϔομ͸CίϯύΠϥͷόʔδϣϯʹґ ଘ͢ΔͷͰɺຖճίϯύΠϧ

Slide 24

Slide 24 text

ܽ఺ 3: ίϯύΠϥ͝ͱͷࠩҟͷରԠ • CίϯύΠϥ͝ͱʹҟͳΔΦϓγϣϯʹରԠ͢Δඞཁ͕͋Δ • جຊతʹ͸ΠϯλϓϦλͷϏϧυͱಉ͡CFLAGS͕ඞਢͩ ͕ɺҰ෦͸ٯʹ࡟Βͳ͍ͱಈ͔ͳ͍ • GCCʹউखͳύον͕౰ͨͬͯΔOSͷσΟετϦϏϡʔ γϣϯ΋͋Δ • Visual Studio͸ϓϦϓϩηε͚ͩͯ͠ग़ྗ͕Ͱ͖ͣશ͘ผͷ ϏϧυγεςϜ

Slide 25

Slide 25 text

ܽ఺ 4: ϓϩηε؅ཧ෦෼ͷ อकίετͷ૿େ • Ruby͕ىಈͨ͠ࢠϓϩηεΛશͯwait͢Δϝιου͕͋ Δ͕ɺ౰વJIT༻GCC͸଴ͪͨ͘ͳ͍ • ͳͷͰɺϩοΫΛऔΓͭͭpidͷϦετΛ؅ཧ͢Δ • ϚϧνεϨου + Ϛϧνϓϩηε + γάφϧϋϯυϥ = ແݶͷrace condition • JITεϨου͸GVLͳ͠ɺϝΠϯͷεϨου΋JITεϨο υ΋fork͠·͘ΓɺSIGCHLDདྷ·͘Γ

Slide 26

Slide 26 text

ܽ఺ 5: ηΩϡϦςΟ্ͷݒ೦ • CίϯύΠϥ΍ϔομɺϥΠϒϥϦ౳͕ࠩ͠ସ͑ΒΕΔͱࠔΔ • CίϯύΠϥ͸Ϗϧυ࣌ͱશ͘ಉ͡ϑϧύεΛ࢖͏ • /tmp ʹݩ͔ΒϑΝΠϧ͕͋Δ৔߹͸஄͘ • ࢓૊Έ্Ͳ͏͠Α͏΋ͳ͍΋ͷ͸ׂΓ੾Δ • Ϣʔβʔ͕GCCΛࣗ༝ʹ࣮ߦͰ͖ΔΑ͏ͳϓϩάϥϜ͸ͦΕࣗମ͕੬ऑ • GCC΍ϔομɺੜ੒ίʔυ͕ࠩ͠ସ͑ΒΕΔύʔϛογϣϯΛऔΒΕͯ΋ෛ͚

Slide 27

Slide 27 text

RubyͷJITख๏Ͱ ࣮ݱՄೳͳ࠷దԽྫ

Slide 28

Slide 28 text

࠷దԽ 1: ελοΫϙΠϯλɺ ϓϩάϥϜΧ΢ϯλͷҠಈ࡟ݮ • ελοΫϕʔεͷVM͕࢖͏ελοΫϙΠϯλͷૢ࡞͕ෆཁ • ྫ֎ͰେҬ୤ग़ͯ͠΋ελοΫ͸໭ͤͳ͍ͱ͍͚ͳ͍ͷ Ͱɺྫ֎Λcatch͠ͳ͍ϝιουʹݶΔ • όΠτίʔυͷσΟεύονʹ࢖͏ϓϩάϥϜΧ΢ϯλͷ ૢ࡞͕ෆཁ • ߦ൪߸ΛऔΔϝιουݺͼग़͠ͷखલͰ͸Ͳ͏ʹ͔෮׆ ͤ͞Δඞཁ͕͋Δ

Slide 29

Slide 29 text

࠷దԽ 2: ΠϯϥΠϯԽΛར༻ͨ͠ ίϯύΠϥʹΑΔ࠷దԽ • ݱࡏ͸ओʹόΠτίʔυ໋ྩͷ࣮૷͕ੜ੒ίʔυ಺͔ΒΠ ϯϥΠϯԽՄೳ • Ϧςϥϧͷ஋ͱόΠτίʔυ໋ྩͷ࣮૷ΛΠϯϥΠϯ Խ͢Δ͚ͩͰɺ1 + 2 ʹର͠ 3 Λੜ੒Ͱ͖Δ • CͷίϯύΠϥ͸ؔ਺αΠζ͕େ͖͍ͱΠϯϥΠϯԽ͠ ͳ͘ͳΔͷͰɺ໌ࣔతͳΠϯϥΠϯԽࢦఆ͕ඞཁͳ͜ ͱ΋

Slide 30

Slide 30 text

࠷దԽ 2: ΠϯϥΠϯԽΛར༻ͨ͠ ίϯύΠϥʹΑΔ࠷దԽ ࣮ݧஈ֊ͷ΋ͷ: • RubyͰهड़͞Εͨϝιου͸ΠϯϥΠϯԽ͕؆୯ͳ͜ͱ ͸Θ͔͍ͬͯΔ • શͯΛΠϯϥΠϯԽ͢ΔͱίϯύΠϧ͕࣌ؒ৳ͼΔͷͰɺ Ͳ͜·ͰίϯύΠϧ͢Δ͔ݕ౼த • ϧʔϓͷΠϯϥΠϯԽ͕Ͱ͖Δͱޮ͕͘ɺϧʔϓ༻ϝιο υ͸CͰ࣮૷͞Ε͓ͯΓɺগ࣮͠૷͕େม

Slide 31

Slide 31 text

࠷దԽ 3: ࣮ߦ࣌ͷ৘ใʹґଘͨ͠ ίʔυੜ੒ • Կ౓͔ݺͼग़͠ࡁͷϝιουʹରͯ͠JITΛߦͳ͏ͷͰɺ JITίϯύΠϧ࣌ʹ͸࣮ߦ࣌ͷܕ৘ใ͕खʹೖΔ • ྫ: ϝιουݺͼग़͠ͷ໋ྩʹ͸ɺϝιουΩϟογϡ ʹϨγʔόͷΫϥε৘ใ͕͋Δɺ౳ • ͦͷܕʹಛԽͯ͠ແବͳ෼ذΛআڈͨ͠Γɺؒ઀ࢀরΛΠ ϯϥΠϯԽ͢ΔͳͲ͢Δͱߴ଎ʹͳΔ

Slide 32

Slide 32 text

ੑೳධՁ

Slide 33

Slide 33 text

ϚΠΫϩϕϯνϚʔΫ: ଎౓ Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks JIT off ͱൺֱͨ͠଎౓ൺ཰ 0 2 4 5 7 aread aref aset aw rte call const2 const fannk fib ivread ivw rite m andelbrot m eteor nbody nest-ntim es nest-w rite norm nsvb red-black sieve trees w hile 6.6 1.2 1.7 1.1 1.0 1.4 2.4 1.3 1.2 1.0 1.3 4.6 3.6 2.8 1.0 5.5 5.5 0.9 2.6 2.7 4.6 2.8 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 JIT off JIT on Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu

Slide 34

Slide 34 text

ϚΠΫϩϕϯνϚʔΫ: ϝϞϦ Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks Max Resident Set Size (MB) 0 13 25 38 50 aread aref aset aw rte call const2 const fannk fib ivread ivw rite m andelbrot m eteor nest-ntim es nest-w hile norm nsvb w hile 38.2 43.7 38.3 42.1 38.3 44.2 45.1 38.3 38.2 38.3 38.3 38.3 38.2 38.3 38.3 38.3 38.3 38.3 14.4 14.5 14.9 14.2 14.4 15.3 14.2 14.3 14.4 14.3 15.0 14.2 14.2 14.8 14.2 14.3 14.3 14.4 JIT off JIT on Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu

Slide 35

Slide 35 text

ϚΠΫϩϕϯνϚʔΫ: ϝϞϦ Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks Max Resident Set Size (MB) 0 100 200 300 400 red-black sieve trees 89.4 193.9 299.4 89.4 193.5 301.7 JIT off JIT on Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu

Slide 36

Slide 36 text

ΞϓϦέʔγϣϯੑೳ 1: ଎౓ Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu Ruby 2.6.0 w/ NESΤϛϡϨʔλ Optcarrot Frames Per Second 0 23 45 68 90 86.6 53.8 JIT off JIT on

Slide 37

Slide 37 text

ΞϓϦέʔγϣϯੑೳ 1: ϝϞϦ Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu Ruby 2.6.0 w/ NESΤϛϡϨʔλ Optcarrot Max Resident Set Size (MB) 0 16 32 48 64 63.7 62.8 JIT off JIT on

Slide 38

Slide 38 text

ΞϓϦέʔγϣϯੑೳ 2: ଎౓ Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu Ruby 2.6.0 w/ https://github.com/benchmark-driver/sinatra Request Per Second 0 2,125 4,250 6,375 8,500 7,466.5 8,442.1 JIT off JIT on

Slide 39

Slide 39 text

ΞϓϦέʔγϣϯੑೳ 2: ϝϞϦ Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu Ruby 2.6.0 w/ https://github.com/benchmark-driver/sinatra Max Resident Set Size (MB) 0 18 35 53 70 64.4 23.7 JIT off JIT on

Slide 40

Slide 40 text

ੑೳิ଍ Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu ʹ͓͍ͯɺ • 1ճͷJITίϯύΠϧʹ͔͔Δ࣌ؒ͸ 60ʙ250 ms ఔ౓ • JIT༗ޮʹ͢Δͱɺ࣮ࡍʹJIT͍ͯ͠ͳͯ͘΋ϐʔΫ࣌ϝϞϦফඅྔ ͕24ʙ28MBఔ౓૿͑Δ͕ɺϝιου1ͭ͸8KBͱ͔ͳͷͰޡࠩ • 24ʙ28MB෦෼͸ະௐࠪ: pthread, mutex, ϑϥάͷจࣈྻ, ...? • GCCͷϝϞϦফඅ: 4.6MBఔ౓, ClangͷϝϞϦফඅ: 24.1MBఔ౓ • /tmp ͷফඅ͸1ϝιου͋ͨΓ࠷௿ .c 12KBɺ.o 4KBɺ.so 8KB

Slide 41

Slide 41 text

ࠓޙͷల๬ WebΞϓϦέʔγϣϯʹ͓͚Δੑೳ޲্ʹϑΥʔΧε: • ࡉ͔͘ίϯύΠϧ͢ΔͱVMىಈճ਺͕૿͑ΔͷͰɺେ͖͘ ΠϯϥΠϯԽͯ͠·ͱΊͯίϯύΠϧ • খ͞ͳϝιου͸caller͔ΒίϯύΠϧͯ͠ΠϯϥΠϯԽ • ଎͘Ͱ͖ͳͦ͞͏ͳϝιου͸ίϯύΠϧ͠ͳ͍౳ɺ࠷దԽ ର৅ͷબ୒ઓུΛվળ͢Δ

Slide 42

Slide 42 text

·ͱΊ • CίϯύΠϥΛ࢖ͬͨJITख๏ͷτϨʔυΦϑΛઆ໌ͨ͠ • ίϯύΠϥࣗମͷϝϯςφϯε͸؆୯ʹͳΔ • ͦΕΛࢧ͑Δج൫ͷอक΍࣮ߦ࣌ͷڍಈ͸ෳࡶԽ͢Δ • Ruby 2.6͸JITʹΑΓCPUܭࢉத৺ͷ༻్Ͱ1.6ഒߴ଎Խͨ͠ • খ͞ͳϝιου͕ͨ͘͞Μ͋Δ৔߹ͷੑೳ͸վળத