これはHubble Advent Calendar 2023の4日目1の記事です。
はじめに
こんにちは!株式会社Hubbleでバックエンドのエンジニアをしている@oaktomeです。
今回は少し前にメインシステムのRubyバージョンをv2.7系から最新安定版のv3.2.2にバージョンアップしたので、対応したポイントをまとめてみました。
またRuby3.1から試験的に導入され、Ruby3.2で正式採用となったJITコンパイラである「YJIT」も有効化してパフォーマンス比較もしてみました。
リリース内容の確認
まずは事前にRubyのリリース内容を確認しておきます。
特に3.0で引数周りが大きく変わり動かなくなるケースがあるので把握しておきましょう。後述しますが今回はあまり大きなインパクトはありませんでした。
キーワード引数系への対応
Hubbleではキーワード引数をほとんど使用していなかったので、コードの修正箇所としては数か所だけでした。
しかし、採用している一部のgemで長期間メンテナンスがされておらず、キーワード引数に対応していなかったものもあったので、代替のgemを採用したりforkしてパッチを当てる対応を行いました。
gemを見直すタイミングはなかなか難しいこともありますが、こういう機会があるとGemlistを見直す機会になりますね!
インパクトが大きくならないように定期的に更新や見直しを行うのも大事です。
rubocopの追加ルール対応
rubocop自体のバージョンやTargetRubyVersion
を更新して、新規のルールが追加されていますので増えたものを確認します。
私たちの方針としては基本的には新しいcopも全て採用した上で、構築とエンジニアリングのカルチャーに沿ってcopの変更や無効化をしています。採用するか判断に迷うルールはチームでアンケートを取ったり協議することで意見を取り入れて決定しています。
..
AllCops:
TargetRubyVersion: 3.2
DisabledByDefault: true
NewCops: enable
Layout:
Enabled: true
Style:
Enabled: true
# Stringはダブルクォートで統一
Style/StringLiterals:
Enabled: true
EnforcedStyle: double_quotes
..
YJITの有効化と計測
YJITの有効化は環境変数でさくっと有効にすることができます。
RUBY_YJIT_ENABLE=1
$ RubyVM::YJIT.enabled?
true
YJITを有効化した結果ですが、リクエスト全体やControllerなどのパフォーマンスは数%程度改善しました。その中で特にActiveRecordのLatencyがリリース前週比(P95)で122μs→87μsで14%の改善をすることができました。
このグラフは監視ツールのDatadogで出したものです。HubbleではBackendの全体的なモニタリングやログ収集にDatadogを使っています。
実測値としての効果は薄いですが、コードやクエリのリファクタを行わず改善ができたのは嬉しいですね!
事前に調査していた通り、メモリの使用量は数十MB増加しましたが、余力が十分にあったため影響を与えるほどではありませんでした。
ちなみにYJITはRuby3.3以上のRailsアプリケーションでデフォルトで有効になるようです。2
最後に
今回書かせていただいたポイント以外にもリファクタリングやRSpecの修正などを加え、全体的な動作チェックを行った上で結果的にバージョンアップは特に問題も起きず無事にリリースすることができました!
メジャーバージョンのアップデートはインパクトのある変更が入るので楽しみもある反面、アップデート内容を事前に把握して影響範囲に気をつけないといけません。
日頃から情報収集をして、トピックをチーム内で話題に上げたりするのもいいと思います。
明日は同じバックエンドエンジニアの@ks01050320141989さんの投稿です!
お楽しみに〜!
-
平日のみの投稿なので、投稿日は6日ですが4日目の記事としています。 ↩