こんにちは。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でさらに改善が進んでいるようですので、リリースがとても楽しみです。