RubyのYJITコンパイラをShopifyが本番に投入、Railsアプリを高速化。Rubyも本格的にJITの時代へ

2023年1月19日

ECサイト構築サービスを提供するShopifyは、Ruby 3.2に搭載されているYJITコンパイラを同社の本番環境に投入し、Railsベースで構築された同社サービスの性能改善を実現したと明らかにしました

YJITコンパイラはShopifyが開発を進めてきたRubyのJITコンパイラで、大規模なRailsアプリケーションにおいてより高い性能向上を目指して開発されたものです。

一昨年末のRuby 3.1でメインラインにマージされ、昨年末に登場したRuby 3.2ではさらに改善が進められて本番環境にも耐えるようになったと説明されており、今回Shopify自身がそれを実証した形になりました。

Rubyの性能向上で役割を果たしてきたJITコンパイラ

Rubyはシンプルで生産性の高いプログラムを書くことができることや、Ruby on Rails(Rails)と呼ばれるWebアプリケーションを容易に構築できるフレームワークを備えていることで人気のプログラミング言語です。

一方で以前から実行速度が遅いと指摘されることが多く、これに対してRuby 3ではRuby 2の3倍の実行速度にするという「Ruby 3x3」(ルビースリーバイスリー)構想の下で高速化が進められてきました。

2018年末にリリースされたRuby 2.6ではJITコンパイラ(MJIT)を初めて実験的に搭載しました。

JITコンパイラは実行時コンパイラとも呼ばれ、プログラムをインタプリタで実行するのと並行してコンパイルを行い、ネイティブバイナリを生成し、それを実行することで実行速度を向上させる技術です。

2020年末にリリースされたRuby 3ではこのMJITなどの成果によってCPU負荷中心のベンチマークで3倍の性能が達成されたことが示されました。

参考:Ruby 3.0正式版リリース。「Ruby 2の3倍速」到達、型の記述、スレッドセーフな並列処理など新機能

しかしMJITはRailsの大規模アプリケーションなどでの性能向上に十分な効果が発揮できていないとの評価もありました。

そこで登場したのが、Railsを大規模に利用しているShopifyが、Railsでの性能改善にフォーカスをして開発を進めてきたJITコンパイラである「YJIT」です。

YJITは2021年末に登場したRuby 3.1でメインラインにマージされ、昨年末(2022年末)に登場したRuby 3.2で本番環境に耐える実用段階に到達したと発表されました。

参考:WebAssembly版Rubyが正式に登場、YJITが実用段階に。「Ruby 3.2.0」正式リリース

JITは実行時にコンパイルを行う仕組み上、インタプリタよりも多くのメモリを要します。Ruby 3.2のYJITでは、Ruby 3.1のYJITに比べてメモリのオーバーヘッドが約3分の1に削減されるなどの改善が行われたことで、本番環境で使えるようになったと説明されています

Ruby 3.2のインタプリタと比較して5%から10%の性能向上

ではShopifyがRuby 3.2のYJITを本番環境に展開したことで、どのくらい速度向上があったのでしょうか。

Shopifyのインフラチームに所属するシニアスタッフエンジニアのJean Boussier氏は、Ruby 3.2にアップデートしたところ、YJITなしの状態で平均でシステムのレイテンシが6.6%改善したことを、、1月13日付けのツイートで明らかにしています。

つまりYJITなしのRubyの実行速度もRuby 3.2で改善されているわけです。

その上で、Shopifyが今回公開した記事「Ruby 3.2’s YJIT is Production-Ready (2023)」では、本番環境において時間帯による違いはあるものの、Ruby 3.2のインタプリタに対してYJITは5%から10%の高速化を実現していることが示されています。下記はその記事で紹介された本番環境での性能比較グラフです。

fig

Shopify CEOのTobi Lutke氏もYJITによって10%以内の高速化が実現したと昨年(2022年)12月にツイートしています。

前述の通りRuby 3.2でインタプリタの性能も向上しているため、YJITが含まれない以前のバージョンのRubyとRuby 3.2のYJITを比較するとすれば、10%かそれ以上の性能向上となりそうです。

アプリケーションはそのままで、YJITによってサービス全体の性能が10%程度向上するのであれば、アプリケーション開発者にとってもインフラチームにとっても一定の成果があるといえるのではないでしょうか。

JavaやJavaScriptに代表されるいくつかのプログラミング言語は、仮想マシンやインタプリタによるコードの実行からJITコンパイラの採用によってさらなる実行性能の向上を実現してきており、いまもその進化を続けています。

RubyにおいてもMJITとYJITのJITコンパイラが、これからのRubyの実行性能の向上に大きな役割を果たしていくものと期待されます。

このエントリーをはてなブックマークに追加
follow us in feedly


関連タグ プログラミング言語 / Ruby



タグクラウド(β版)

クラウド / AWS / Azure / Google Cloud
コンテナ / Docker / Kubernetes
クラウドネイティブ / サーバレス
クラウド障害 / 運用・監視

プログラミング言語 / 開発ツール
JavaScript / Java / .NET / WebAssembly
HTML/CSS / Web標準

アジャイル開発 / スクラム / DevOps / CI/CD
ソフトウェアテスト・品質
ローコード/ノーコード開発

データベース / RDB / NoSQL / 機械学習・AI
Oracle Database / MySQL / PostgreSQL
Office / 業務アプリケーション

ネットワーク / HTTP / QUIC / セキュリティ
OS / Windows / Linux / VMware
ハードウェア / サーバ / ストレージ

業界動向 / 働き方 / 給与・年収
編集後記 / 殿堂入り / おもしろ

全てのタグを見る

Blogger in Chief

photo of jniino

Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。
詳しいプロフィール

Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed


最新記事10本