こんにちは。サーバーサイドグループの山田です。
先日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週間になります。
p50では平均が19.3msから18.1msとなり約6%高速化されていました。
続いて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のスポンサーをさせていただきます。
また、私を含めて数名が現地参加しますので、お会いした際はどうぞよろしくお願いします!