$30 off During Our Annual Pro Sale. View Details »

Ruby 3.0 JIT on Rails

Ruby 3.0 JIT on Rails

Takashi Kokubun

July 03, 2020
Tweet

More Decks by Takashi Kokubun

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. View Slide

  4. એ఻

    View Slide

  5. એ఻

    View Slide

  6. એ఻

    View Slide

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

    View Slide

  8. Ruby 3.0 JIT ͷݱࡏͷੑೳ

    View Slide

  9. mame/optcarrot
    3VCZ
    3VCZ
    3VCZ
    GSBNFTTFD







    7. +*5

    View Slide

  10. benchmark-driver/sinatra
    3VCZ
    3VCZ
    3VCZ
    SFRVFTUTTFD







    7. +*5

    View Slide

  11. k0kubun/railsbench
    3VCZ
    3VCZ
    3VCZ
    SFRVFTUTTFD







    7. +*5

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. VTune: benchmark-driver/sinatra - VM

    View Slide

  18. VTune: benchmark-driver/sinatra - JIT

    View Slide

  19. VTune: k0kubun/railsbench - VM

    View Slide

  20. VTune: k0kubun/railsbench - JIT

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. C Λ Ruby ʹॻ͖׵͑ͯΔ࿩

    View Slide

  29. RubyKaigi 2018

    View Slide

  30. RubyKaigi 2019

    View Slide

  31. View Slide

  32. View Slide

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

    View Slide

  34. Builtin ϝιουͱ͸

    View Slide

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

    View Slide

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

    View Slide

  37. Builtin attr inline Λ͚ͭΔྫ

    View Slide

  38. ϝιουϑϨʔϜεΩοϓͷޮՌ
    ,FSOFMDMBTT
    JT





    7. +*5 +*5
    GSBNFTLJQ
    1.3x
    1.7x

    View Slide

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

    View Slide

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

    View Slide

  41. ࠓޙͷ JIT ΞʔΩςΫνϟ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide