Studyplus Engineering Blog

スタディプラスの開発者が発信するブログ

Ruby3.3 YJITによるパフォーマンス改善

こんにちは。サーバーサイドグループの山田です。

先日StudyplusのRailsアプリケーションのRubyを3.3にアップデートしました。
Ruby3.3ではYJITによるパフォーマンス改善が目玉の1つですが、弊社のアプリケーションでどのような変化があったかを報告します。

前提

本記事で記載している集計データは以下のようなアプリケーションおよび条件で取得しています。

  • Studyplusのマイクロサービス群の中で最も規模の大きなRailsアプリケーション
  • Railsバージョンは7.1.3
  • Ruby3.2.2でYJIT有効化済みの状態からRuby3.3.0にアップデートした際の変化
  • APIリクエストを集計の対象とし、非同期処理などは対象外
  • --yjit-exec-mem-size--yjit-call-threshold はデフォルト設定のままYJITを有効化

APIレスポンスタイムの変化

以下はアップデート前後1週間のAPIリクエスト全体のレスポンスタイムの50-percentile、95-percentile(以降はそれぞれp50、p95と記載)になります。
それぞれグレーの点線がアップデート前の1週間、青線がアップデート後の1週間になります。

アップデート前後のAPIのレスポンスタイム(p50)

p50では平均が19.3msから18.1msとなり約6%高速化されていました。

アップデート前後のAPIのレスポンスタイム(p95)

続いてp95では平均が136.2msから125.7msとなり約8%高速化されていました。

アップデート前後の比較のため完全に同じ条件ではありませんが、リクエスト数などに大きな変化はありませんでした。*1そのため約6~8%程度高速化された言えると思います。

レスポンスタイムはRubyの処理だけではなく、SQLなどDB周りの処理の実行時間も含まれています。そのことを考えると大幅な改善ではないでしょうか。

メモリ使用量の変化

Ruby3.3のYJITではメモリ使用量の改善もされているため、メモリ使用量についても確認します。

以下はリリース前後のメモリ使用量の合計の変化です。*2

リリース前後のメモリ使用量の変化

平均は40.2GBから42.0GBとなり約4%上昇しました。
メモリ使用量の改善も期待されましたが、弊社のアプリケーションでは改善は見られませんでした。
上述した通り、--yjit-exec-mem-size--yjit-call-thresholdなどのオプションをデフォルトで利用している状態のため、この辺りをチューニングしていくことで改善が見込まれる可能性はあります。

まとめ

本記事では、StudyplusのバックエンドのRubyバージョンを3.2.2からRuby3.3.0へのアップデートした際のパフォーマンスの変化を紹介しました。

APIのレスポンスタイムで約6~8%の高速化が見られました🎉
バージョンを上げるだけでパフォーマンスが改善されるのはとてもありがたいですね。
Rubyコミッターの皆様に感謝です!

最後に、弊社は昨年に引き続き5月に開催されるRubyKaigi2024のスポンサーをさせていただきます。
また、私を含めて数名が現地参加しますので、お会いした際はどうぞよろしくお願いします!

*1:アップデート前後の1週間でAPIリクエスト数が約7%増加しているため、アップデート後の方が条件としては不利になっています。

*2:対象のアプリケーションはk8s上で動作しています。グラフは対象のアプリケーションが動作するDeploymentのメモリ使用量の合計値です。