STORES 予約 でエンジニアリングマネージャーをしている natsume です。
今回はRubyKaigi 2023に参加して「うぉぉなんかやるぞぉ!」となった結果、STORES 予約 のバックエンドであるRailsアプリケーションをYJIT有効化しパフォーマンス向上できました。
動機からわかるとおり、YJIT有効化までノリと勢いでやりました。
影響されたセッションはDAY2のKeynoteである Optimizing YJIT’s Performance, from Inception to Production です。 (影響はされましたが内容は全然わからなかった。英語勉強する、絶対) rubykaigi.org
有効化の手順
STORES 予約 ではすでにRuby 3.2を利用していたのでかなりサクッとできました。
利用しているDocker imageで対応確認
Debian(slim)を利用しているので、そちらのImageでYJITがサポートしているか確認します。
docker run -it ruby:3.2.2-slim ruby --yjit -e 'p RubyVM::YJIT.enabled?' true
問題なく使えました。
ちなみにこちらのPRにてDebian対応がされています。 github.com
Dockefileに環境変数をセット
RUBY_YJIT_ENABLE=1
をセットするとYJITが有効な状態でRubyが実行されます。
STORES 予約 はECSで動いており、環境はDockerfileで作っているのでそこに環境変数を入れていきます。
+ ENV RUBY_YJIT_ENABLE=1
ちなみに、dotenvなどで環境変数をセットしてもRuby起動後に環境変数がセットされるので有効になりません(ちょっとハマりました)
BuildしたImageで確認
BuildしたImageの中で ruby -v
を実行するとYJITで実行されていることがわかります。
ad7108378f4d:/usr/src/app# ruby -v ruby 3.2.2 (2023-03-30 revision e51014f9c0) +YJIT [aarch64-linux]
その後Stagingで問題なく動くか確認をしました。
メモリ使用量の確認
Ruby3.1から3.2でYJITのメモリ使用量はかなり改善したようですが、有効化することでメモリ使用量が増加することは見込まれます。
メモリ使用量には余裕があったので、気にしつつも大きな対応は不要でした。
パフォーマンスの確認
STORES 予約 のRailsではAPI以外にもSlimでレンダリングしてる部分もあります。 それらを踏まえて見ていきましょう。
今回はYJIT有効化した前後で比較してサクッと確認しました。(前日比はバラツキが多く有意ではなかったので省いています)
Rack RequestのLatency Graphを見てみるとYJIT有効化した後に若干下がっていることが確認できました。P50だとわかりやすいですね。
さらに各項目のLatencyを比較してみました。
メトリクス | 前 | 後 | 改善率 | |
---|---|---|---|---|
Rack Request | p90 | 102.3ms | 95.2ms | 7.46% |
Rack Request | p95 | 169.1ms | 158.8ms | 6.49% |
ActiveRecord Instantiation | p90 | 151μs | 132μs | 14.39% |
ActiveRecord Instantiation | p95 | 288μs | 247μs | 16.60% |
Render Template | p90 | 122.5ms | 183.4ms | 2.89% |
Render Template | p95 | 188.7ms | 123.6ms | -0.89% |
Rack Requestでは6〜7%改善されていました!
ActiveRecord Instantiationの改善率は大きく、Render Templateでは影響は小さいようです。
Render Templateはページによってバラつきが大きい部分なので比較値が正しくない可能性も大いにありそうです。
Shopifyでは5%〜10%の処理速度の改善があったそうなので、STORES 予約でも同等のパフォーマンスの改善が見込めました!
まとめ
なにかに影響されて勢いでやりきるってのはいいものですね。会場では別プロダクトのRubyを3.1にするぞー!ってもくもくタイムをしたりもしました。
RubyKaigi 2023も初参加でしたが最初のセッションからオフィシャルパーティー・アフターパーティー(STORES 主催)までとても楽しめました!
Rubyコミュニティに大感謝!
興味を持っていただけたら、ぜひカジュアル面談にお越しください!