Cコンパイラを利用したRubyのJITコンパイラ / Programming Symposium 60

Cコンパイラを利用したRubyのJITコンパイラ / Programming Symposium 60

第60回 プログラミング・シンポジウム

08d5432a5bc31e6d9edec87b94cb1db1?s=128

Takashi Kokubun

January 12, 2019
Tweet

Transcript

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

  2. ࣗݾ঺հ • ࠃ෼ ਸࢤ (@k0kubun) • ॴଐ: τϨδϟʔσʔλגࣜձࣾ (Arm͕ങऩ) •

    Rubyίϛολʔ 3೥໨ • JITίϯύΠϥΛ։ൃ • ςϯϓϨʔτΤϯδϯͷϝϯςφ
  3. LLRB - LLVMϕʔεͷRubyͷJIT

  4. Ruby 2.6ͰͷJIT։ൃ

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

  6. RubyͷJITख๏ͷ֓ཁ

  7. RubyͱJITʹ͍ͭͯ • Ruby: ಈతܕ෇͚ͷΦϒδΣΫτࢦ޲εΫϦϓτݴޠ • ελοΫϕʔεͷόΠτίʔυΛ࣋ͭVirtual Machine • JITίϯύΠϧ: ࣮ߦ࣌ίϯύΠϧ

    • ຊൃදͰ͸ɺRuby VMͷόΠτίʔυͷ͔ΘΓʹɺJITͰੜ੒ ͨ͠ػցޠΛݺͼग़͢͜ͱͰ࠷దԽ͢Δ໨తʹ࢖͏
  8. RubyʹJITΛಋೖ͢Δഎܠͱ໨త എܠ: • Ruby͸WebΞϓϦέʔγϣϯʹΑ͘࢖ΘΕΔ ໨త: • WebΞϓϦέʔγϣϯαʔόʔͳͲ௕ظ࣮ߦ͢Δϓϩ άϥϜͰੑೳΛ্͛ɺϢʔβʔମݧΛ޲্ͤͨ͞Γɺ αʔόʔ୆਺ΛݮΒͨ͠Γ͍ͨ͠

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

    • JIT༻ͷεϨου͕ϝιου୯ҐͰόΠτίʔυΛػցޠ ʹίϯύΠϧ
  10. ຊख๏ͷ֓ཁ 1. όΠτίʔυΛCͷίʔυʹม׵ + CͷϨϕϧͰ࠷దԽ 2. σΟεΫ (/tmp) ʹ .c

    ͷϑΝΠϧΛॻ͖ग़͢ 3. RubyΠϯλϓϦλ͕࣮ߦ࣌ʹCίϯύΠϥϓϩηεΛىಈ 4. ੜ੒ͨ͠ .so ϑΝΠϧΛಈతϩʔυ 5. όΠτίʔυͷ୅ΘΓʹϩʔυͨؔ͠਺ΛݺͿΑ͏ʹมߋ
  11. ຊख๏ͷ֓ཁ

  12. ຊख๏ͷ֓ཁ

  13. None
  14. RubyͷJITख๏ͷར఺

  15. ར఺ 1: ΞηϯϒϦίʔυੜ੒͔Βͷ։์ • ؆୯: ςϯϓϨʔτΤϯδϯͰಈతͳCίʔυੜ੒ • VMΛ࣮૷͢Δ͚ͩͰσϑΥϧτͷJIT࣮૷Λࣗಈੜ੒Ͱ͖Δ • ϙʔλϒϧ:

    ΠϯλϓϦλ͕ϏϧυͰ͖Δ؀ڥͰ͸࢖͑Δ͸ͣ • Cͷ࢓༷͕มΘΒͳ͍ͷͰLLVMͷΑ͏ʹඇޓ׵ʹৼΓճ͞Εͳ͍
  16. ར఺ 2: σόοΨΛ࢖ͬͨղੳίετͷ௿Լ • gdb౳Ͱσόοά͢ΔࡍɺVMͷ࣮૷ͱಉ͡C͚ͩΛݟΔ͜ ͱʹͳΔ • ίʔυੜ੒͕ࣗલͳΒɺσόοά৘ใೖΕΔͷ΋ࣗલʹͳ Γେมͦ͏

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

  18. ར఺ 4: ෳ਺ͷίϯύΠϥج൫͕׆༻Մೳ • GCCͱClang/LLVMͷ྆ํ͕ར༻ՄೳͰɺVisual Studioʹ ΋ରԠ • ΍Ζ͏ͱࢥ͑͹LLVM PassΛࣗ࡞ͯ͠

    opt(1) ͔Β࢖͑Δ ͔΋͠Εͳ͍
  19. RubyͷJITख๏ͷܽ఺

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

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

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

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

    ଘ͢ΔͷͰɺຖճίϯύΠϧ
  24. ܽ఺ 3: ίϯύΠϥ͝ͱͷࠩҟͷରԠ • CίϯύΠϥ͝ͱʹҟͳΔΦϓγϣϯʹରԠ͢Δඞཁ͕͋Δ • جຊతʹ͸ΠϯλϓϦλͷϏϧυͱಉ͡CFLAGS͕ඞਢͩ ͕ɺҰ෦͸ٯʹ࡟Βͳ͍ͱಈ͔ͳ͍ • GCCʹউखͳύον͕౰ͨͬͯΔOSͷσΟετϦϏϡʔ

    γϣϯ΋͋Δ • Visual Studio͸ϓϦϓϩηε͚ͩͯ͠ग़ྗ͕Ͱ͖ͣશ͘ผͷ ϏϧυγεςϜ
  25. ܽ఺ 4: ϓϩηε؅ཧ෦෼ͷ อकίετͷ૿େ • Ruby͕ىಈͨ͠ࢠϓϩηεΛશͯwait͢Δϝιου͕͋ Δ͕ɺ౰વJIT༻GCC͸଴ͪͨ͘ͳ͍ • ͳͷͰɺϩοΫΛऔΓͭͭpidͷϦετΛ؅ཧ͢Δ •

    ϚϧνεϨου + Ϛϧνϓϩηε + γάφϧϋϯυϥ = ແݶͷrace condition • JITεϨου͸GVLͳ͠ɺϝΠϯͷεϨου΋JITεϨο υ΋fork͠·͘ΓɺSIGCHLDདྷ·͘Γ
  26. ܽ఺ 5: ηΩϡϦςΟ্ͷݒ೦ • CίϯύΠϥ΍ϔομɺϥΠϒϥϦ౳͕ࠩ͠ସ͑ΒΕΔͱࠔΔ • CίϯύΠϥ͸Ϗϧυ࣌ͱશ͘ಉ͡ϑϧύεΛ࢖͏ • /tmp ʹݩ͔ΒϑΝΠϧ͕͋Δ৔߹͸஄͘

    • ࢓૊Έ্Ͳ͏͠Α͏΋ͳ͍΋ͷ͸ׂΓ੾Δ • Ϣʔβʔ͕GCCΛࣗ༝ʹ࣮ߦͰ͖ΔΑ͏ͳϓϩάϥϜ͸ͦΕࣗମ͕੬ऑ • GCC΍ϔομɺੜ੒ίʔυ͕ࠩ͠ସ͑ΒΕΔύʔϛογϣϯΛऔΒΕͯ΋ෛ͚
  27. RubyͷJITख๏Ͱ ࣮ݱՄೳͳ࠷దԽྫ

  28. ࠷దԽ 1: ελοΫϙΠϯλɺ ϓϩάϥϜΧ΢ϯλͷҠಈ࡟ݮ • ελοΫϕʔεͷVM͕࢖͏ελοΫϙΠϯλͷૢ࡞͕ෆཁ • ྫ֎ͰେҬ୤ग़ͯ͠΋ελοΫ͸໭ͤͳ͍ͱ͍͚ͳ͍ͷ Ͱɺྫ֎Λcatch͠ͳ͍ϝιουʹݶΔ •

    όΠτίʔυͷσΟεύονʹ࢖͏ϓϩάϥϜΧ΢ϯλͷ ૢ࡞͕ෆཁ • ߦ൪߸ΛऔΔϝιουݺͼग़͠ͷखલͰ͸Ͳ͏ʹ͔෮׆ ͤ͞Δඞཁ͕͋Δ
  29. ࠷దԽ 2: ΠϯϥΠϯԽΛར༻ͨ͠ ίϯύΠϥʹΑΔ࠷దԽ • ݱࡏ͸ओʹόΠτίʔυ໋ྩͷ࣮૷͕ੜ੒ίʔυ಺͔ΒΠ ϯϥΠϯԽՄೳ • Ϧςϥϧͷ஋ͱόΠτίʔυ໋ྩͷ࣮૷ΛΠϯϥΠϯ Խ͢Δ͚ͩͰɺ1

    + 2 ʹର͠ 3 Λੜ੒Ͱ͖Δ • CͷίϯύΠϥ͸ؔ਺αΠζ͕େ͖͍ͱΠϯϥΠϯԽ͠ ͳ͘ͳΔͷͰɺ໌ࣔతͳΠϯϥΠϯԽࢦఆ͕ඞཁͳ͜ ͱ΋
  30. ࠷దԽ 2: ΠϯϥΠϯԽΛར༻ͨ͠ ίϯύΠϥʹΑΔ࠷దԽ ࣮ݧஈ֊ͷ΋ͷ: • RubyͰهड़͞Εͨϝιου͸ΠϯϥΠϯԽ͕؆୯ͳ͜ͱ ͸Θ͔͍ͬͯΔ • શͯΛΠϯϥΠϯԽ͢ΔͱίϯύΠϧ͕࣌ؒ৳ͼΔͷͰɺ

    Ͳ͜·ͰίϯύΠϧ͢Δ͔ݕ౼த • ϧʔϓͷΠϯϥΠϯԽ͕Ͱ͖Δͱޮ͕͘ɺϧʔϓ༻ϝιο υ͸CͰ࣮૷͞Ε͓ͯΓɺগ࣮͠૷͕େม
  31. ࠷దԽ 3: ࣮ߦ࣌ͷ৘ใʹґଘͨ͠ ίʔυੜ੒ • Կ౓͔ݺͼग़͠ࡁͷϝιουʹରͯ͠JITΛߦͳ͏ͷͰɺ JITίϯύΠϧ࣌ʹ͸࣮ߦ࣌ͷܕ৘ใ͕खʹೖΔ • ྫ: ϝιουݺͼग़͠ͷ໋ྩʹ͸ɺϝιουΩϟογϡ

    ʹϨγʔόͷΫϥε৘ใ͕͋Δɺ౳ • ͦͷܕʹಛԽͯ͠ແବͳ෼ذΛআڈͨ͠Γɺؒ઀ࢀরΛΠ ϯϥΠϯԽ͢ΔͳͲ͢Δͱߴ଎ʹͳΔ
  32. ੑೳධՁ

  33. ϚΠΫϩϕϯνϚʔΫ: ଎౓ 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
  34. ϚΠΫϩϕϯνϚʔΫ: ϝϞϦ 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
  35. ϚΠΫϩϕϯνϚʔΫ: ϝϞϦ 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
  36. ΞϓϦέʔγϣϯੑೳ 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
  37. ΞϓϦέʔγϣϯੑೳ 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
  38. ΞϓϦέʔγϣϯੑೳ 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
  39. ΞϓϦέʔγϣϯੑೳ 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
  40. ੑೳิ଍ 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
  41. ࠓޙͷల๬ WebΞϓϦέʔγϣϯʹ͓͚Δੑೳ޲্ʹϑΥʔΧε: • ࡉ͔͘ίϯύΠϧ͢ΔͱVMىಈճ਺͕૿͑ΔͷͰɺେ͖͘ ΠϯϥΠϯԽͯ͠·ͱΊͯίϯύΠϧ • খ͞ͳϝιου͸caller͔ΒίϯύΠϧͯ͠ΠϯϥΠϯԽ • ଎͘Ͱ͖ͳͦ͞͏ͳϝιου͸ίϯύΠϧ͠ͳ͍౳ɺ࠷దԽ ର৅ͷબ୒ઓུΛվળ͢Δ

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

    • খ͞ͳϝιου͕ͨ͘͞Μ͋Δ৔߹ͷੑೳ͸վળத