Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

クリスマスを待たずに Rust版YJITの実力を検証 ファインディ 浜田直人

Slide 3

Slide 3 text

自己紹介 【略歴】 SIerとして様々なプロジェクトを経験したのち、1つの事業に 専念するためにWeb系の事業会社へ。 その後、スタートアップでプロダクトの立ち上げを経験して、 2022年5月にファインディに参画。 現在は、Findy Teamsのフロント&バックエンド開発を担当。 浜田 直人 ファインディ株式会社 @hamchance0215

Slide 4

Slide 4 text

RubyKaigi初参加でした! 久しぶりのオフラインイベント、夜な夜な飲めてRuby漬けの3日 間でとても楽しかったです! RubyKaigi 2022、お疲れ様でした!! 右上の写真は @kiwatchi1991 さんの写真をお借りました。ありがとうございます 󰚤 https://twitter.com/kiwatchi1991/status/1568256669284724736?s=46&t=kypvW77-pwwv2IphSpm3FA

Slide 5

Slide 5 text

RubyKaigi 2022、お疲れ様でした!! 様々なセッションがありましたが YJIT 掘り下げてみようと思います。

Slide 6

Slide 6 text

YJITの復習 ● Ruby2.6で追加されたMJITと別にShopifyが開発。 ● Ruby3.1で追加されたがx86でしか動かなかった。 ○ Ruby3.2でARMでも動作するようになった! ○ Ruby3.2でRustでリビルド!

Slide 7

Slide 7 text

YJITの復習 ● Ruby2.6で追加されたMJITと別にShopifyが開発。 ● Ruby3.1で追加されたがx86でしか動かなかった。 ○ Ruby3.2でARMでも動作するようになった! ○ Ruby3.2でRustでリビルド! RubyKaigi中(9/9)にリリースされた Ruby 3.2.0 preview2で触ることができる!!

Slide 8

Slide 8 text

パフォーマンス検証 ● プロダクトで使われている処理をピックアップ ○ Read系のリクエスト ○ Read+Writeするジョブ ● 比較するRubyバージョン ○ 3.1.2 ○ 3.2.0preview2 ○ 3.2.0preview2 + YJIT 本当はRuby3.1系のYJITも試 したかったが手元の検証環境 がM1 Macなのでパス・・・

Slide 9

Slide 9 text

● 検証環境 ○ Macbook pro(M1) ○ Docker Desktop ○ docker hubのRuby公式イメージを一部カスタマイ ズして利用 ■ RustをインストールしてRubyをbuild パフォーマンス検証

Slide 10

Slide 10 text

RubyKaigiのセッションで予習済み!      https://speakerdeck.com/hsbt/why-is-building-the-ruby-environment-hard Why is building the Ruby environment hard? この他にも環境構築 でハマりやすいポイ ントが紹介されてい たので要チェックで す!

Slide 11

Slide 11 text

# Rustインストール RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ・・・ # --enable-yjit=devを追加 ./configure \ --enable-yjit=dev \ ・・・ ENV RUBY_YJIT_ENABLE=1 Dockerfile抜粋

Slide 12

Slide 12 text

● Benchmarkで実行時間を測定 ● Stackprofで時間がかかっている処理を特定 ○ A sampling call-stack profiler for Ruby. ○ https://github.com/tmm1/stackprof ○ デフォルト設定で実行(sampling mode: wall) パフォーマンス検証

Slide 13

Slide 13 text

Read系のリクエスト Benchmarkで100回測定した平均値 Ruby 実行時間(秒) 3.1.2 0.06445552 3.2.0 preview2 0.11893397 3.2.0 preview2 +yjit 0.10481816 3.1.2 >>>> 3.2.0 +yjit > 3.2.0

Slide 14

Slide 14 text

Read系のリクエスト Stackprof Ruby SAMPLES (pct) FRAME 3.1.2 11039 (62.6%) Mysql2::Client#_query 3.2.0 preview2 11909 (51.7%) Mysql2::Client#_query 3.2.0 preview2 +yjit 10572 (51.6%) Mysql2::Client#_query Mysql2::Client#_queryが重いのは同じ。 重い処理の傾向は同じなので、 3.2は全体的に重くなっている? 🤔 sampling mode: object も試したが傾向の差異は 見られず

Slide 15

Slide 15 text

Read+Writeするジョブ Benchmarkで100回測定した平均値 Ruby 実行時間(秒) 3.1.2 2.0178659 3.2.0 preview2 2.7322675 3.2.0 preview2 +yjit 2.4381335 3.1.2 >>>> 3.2.0 +yjit >> 3.2.0

Slide 16

Slide 16 text

Read+Writeするジョブ Stackprof Ruby SAMPLES (pct) FRAME 3.1.2 13367 (74.4%) IO#wait_readable 3096 (17.2%) Mysql2::Client#_query 3.2.0 preview2 12977 (65.8%) IO#wait_readable 4493 (22.8%) Mysql2::Client#_query 3.2.0 preview2 +yjit 13536 (59.3%) IO#wait_readable 4750 (20.8%) Mysql2::Client#_query こちらも重い処理は同じ傾向だが全体的に重くなっている? 🤔

Slide 17

Slide 17 text

結果 3.1.2 >>>> 3.2.0 preview2 +yjit >> 3.2.0 preview2

Slide 18

Slide 18 text

結果 3.1.2 >>>> 3.2.0 preview2 +yjit >> 3.2.0 preview2 YJITが有効になっている方が速い のでYJITは高速化に寄与している ことがわかる!!

Slide 19

Slide 19 text

結果 3.1.2 >>>> 3.2.0 preview2 +yjit >> 3.2.0 preview2 3.1.2より3.2.0 preview2は遅い。 今回比較した処理では結構差が出た。

Slide 20

Slide 20 text

結果 ● Ruby3.2でYJIT有無で比較するとYJITを有効にした方 が速い。 ○ YJITによって高速化されている!! ● Ruby3.1と比較するとRuby3.2は遅い。 ○ まだpreview版なので今後に期待!!

Slide 21

Slide 21 text

結果 ● Ruby3.2でYJIT有無で比較するとYJITを有効にした方 が速い。 ○ YJITによって高速化されている!! ● Ruby3.1と比較するとRuby3.2は遅い。 クリスマスにリリースされるであろう Ruby3.2.0に期待!!