😇

【未解決】Ruby3.2.0にupdateしてYJITを有効化したら失敗した話

2023/02/28に公開2

株式会社ウェイブcoolmicという日本のコミックを海外向けに配信するWEBサービスの開発を行なっております、こしけです!
今回が初投稿になります!
本日はRuby3.2系から実用段階になったYJITをcoolmicで有効にしたら失敗した話を書いていこうと思います。

導入するきっかけ

coolmicでは様々な機能の追加や、既存のコードの負債の影響で処理速度が低下してきているのが課題でした。そんな中でRubyのupdateを行なっている最中にYJITという存在を知りました。
こちらの記事では導入後全体的に2-3割のレスポンスタイムの削減がされたという記載もあり、coolmicでもかなり恩恵がありそうなので導入してみようという流れになりました。

導入方法

Ruby3.2.0のDockerイメージにはYJITの組み込みが既にされているので、DockerfileのENVにRUBY_YJIT_ENABLE=1を追加するだけで大丈夫でした!

効果

以下のグラフが導入後3日と導入前3日の平均レスポンスタイムの比較になります。
その下にあるのがリクエスト数の比較になります。
リクエスト数はほぼ変わらない or 微増にも関わらずレスポンスタイムは30-40%程度改善されております。
実際にサイトを使ってみると体感でも早くなっているなと感じました!

発生した問題

体感でも早くなるレベルでレスポンスタイムの改善が出来て喜んでいたある日、、、
k8sのPod restartの通知が飛んできました、、、。
最初はリクエストが増えてたまたま発生したのかと思ったのですが、継続的に通知が飛んできていました。
調査をしてみるとPodのメモリ上限に達してしまっていてrestartが発生していた様でした。
coolmicではPodのメモリ上限を600MBに設定しているのですが、下記のグラフを見るとメモリ使用量が増え続けて上限まで達してしまっているのが分かると思います。

YJITはデフォルトで64MBのメモリを確保する[1]のですが、それ以上は確保されないと思っていたのでなぜこの様な現象が起きたのかが分からず、同じ事象で悩んでいる人もほとんど見当たりませんでした。
唯一下記の質問に関する回答の中で同じ様な事象の人がいたのですが、原因や解決策などは分かりませんでした。
Ruby 3.2 YJIT amount of memory needed & performance gain?

今後について

YJITを有効にすることで受けられる恩恵はかなり大きいと思うので、導入出来る様に継続的に調査はしていこうと考えております。
何か新しい情報を見つけ次第こちらの記事を更新させていただきます!

最後に

株式会社ウェイブでは、電子コミックやアニメ配信サービスなどを自社開発で運営しております。
今回の様に新しい事にもチャレンジしやすい環境が整っているウェイブで一緒に働いてみませんか?
興味ある方は是非こちらをご覧ください!
https://recruit.wwwave.jp/career/

脚注
  1. https://www.ruby-lang.org/ja/news/2022/12/25/ruby-3-2-0-released/ ↩︎

wwwave's Techblog

Discussion

k0kubunk0kubun

この記事に対する返答として、YJITの性能を最大限引き出す方法 という記事を書きました。こちらがお役に立てれば幸いです。

こしけこしけ

ありがとうございます!🙇
だいぶ八方塞がりの状態だったので、作成いただいた記事を参考に再度試してみようと思います!