Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

EightをRuby3.2 から Ruby3.3+YJITにアップグレードした結果

こんにちは。Eightでサーバーサイドエンジニアをしている坂田です。 Eightは、ほぼすべての機能を1つのRailsアプリケーションから提供しています。最近、そのアプリケーションのRubyを3.3にアップグレードしました。
また、Ruby3.2時点では見送っていたYJITをこの度有効にしました。YJIT無効状態から3.3+YJITへ移行後、どのような結果になったかを共有します。
YJIT自体の説明や、導入方法については既にさまざまな記事で紹介されているので、今回はEightの導入後の結果にフォーカスして紹介させてください。

EightのRailsアプリケーションについて

Railsアプリケーションの規模の参考として、 rails stats の結果を一部抜粋します。

Name Lines LOC Classes
Controllers 28359 21376 349
Helpers 1576 1155 0
Jobs 8009 5966 204
Models 132055 99839 1881
Total 633295 512669 2525

60万行、2500クラスほどの、一定規模が大きなRailsアプリケーションです。

導入後のパフォーマンスの変化について

Eightは、ビジネスシーンで利用される為に平日の8:00〜19:00あたりに負荷が上がります。 今回はYJIT導入前の月曜日〜金曜日と、導入後の月曜日〜金曜日で比較をしてみます。

レスポンスタイム(平均)

データポイントの平均

Ruby 3.2 Ruby3.3 + YJIT
91 ms 79 ms

13%ほどの改善が確認できました!

レスポンスタイム(p95)

データポイントの平均

Ruby 3.2 Ruby3.3 + YJIT
339 ms 278 ms

18%ほどの改善が確認できました!

メモリ使用率

YJITの仕組み上メモリ使用率は上がってしまいますが、Eightではどの程度上昇したか確認しました。

--yjit-exec-mem-size--yjit-call-threshold などのメモリ使用率に影響を与えるような項目はすべてデフォルトのまま使用しています。

データポイントの平均

Ruby 3.2 Ruby3.3 + YJIT
1.63 GiB 2.23 GiB

27%の上昇を確認しました。

最後に

いかがでしたでしょうか。 Eightでは、Ruby3.3+YJIT の導入により、13%〜18% の速度改善、25〜30% のメモリ使用率上昇という結果になりました。

思い返せば、Ruby3.1がリリースされた2021年冬。EightのRuby versionは2.7でした。 規模が大きなサービスで、10年以上の歴史があるRailアプリケーションのRubyバージョンを上げていくことは、容易なことではありません。 その為、当時はサポートが切れるギリギリに1つずつバージョンを上げていくような運用をしていました。 2021年冬、Rubyを最新版にしてYJITを使いたい!という想いで、数年間、対応をし続けてようやくここまできました。

何より、ただバージョンを上げるだけでここまでサービス全体の性能を向上させられたのはRuby、YJIT開発チームの方々のおかげです。 本当にありがとうございます。

Ruby 3.4でさらに改善が進んでいるようですので、リリースがとても楽しみです。

© Sansan, Inc.