Ruby 3.3.1にアプデし、大幅にパフォーマンスが向上。YJITの改善を実感
noteのRuby 3.2.2を3.3.1へアップデートしました。Ruby 3.3.0のリリースノートに記載されていた「YJITの大幅なパフォーマンス改善」が、noteのAPIにも大きな影響をもたらしました。
CTOが驚きのポストをするほどパフォーマンスが向上したのです。
また、3.2系から3.3系へのアップデート時はそれほど大きな問題は起きませんでしたが、この記事ではアップデート時の注意点を2つほど紹介したいと思います。
今回の3.3.1へのアップデートや前回行ったRuby / Railsのアップデート、MySQLのv3アップデートも、上記の記事を執筆したtic40さんが担当しました。大感謝。
パフォーマンスが大幅に向上
もともと、noteではRuby 3.2.2にアップデートをし、YJITオプションをオンにした際にも、約20%ほどのレイテンシの改善が見られていました。これだけでも驚異的です。
今回の3.3.1のアップデートでは、10時のリリースで明確にレイテンシとリクエストタイムが半減されていることがわかります。
社内でも、「え?本当に?測定ミスしてない?」という声が挙がるほどでした。YJITの「大幅なパフォーマンスの改善」をこんなにも早く実感するとは思いませんでした。
3.2系から3.3系へのアップデート時の注意点
3.2.2から3.3.1へのアップデートでは、構文などが大きく変更されるようなことありませんでした。アップデート時の問題はそれほどなかったのですが、2つほどアップデート時の学びを紹介します。
3.3.0のアップデートを見送った
当初は、3.3.0がリリースされた際にすぐにアップデートをしようと思っていました。
しかし、上記のバグ報告でもあるとおり、Fiber.new{}.resumeを実行するとセグメンテーション違反でエラーが発生するようになってしまったのです。特定のコンパイルオプションの設定が不足していることが原因で、Apple M1およびM2チップ上で動作する仮想環境で発生しやすいようでした。
3.3.1で修正されるとのことだったので、3.3.0へのアップデートは見送ることにしました。
Time.new の変更
Time.new('2024-5')
Time.new('2024-5-29')
# => エラーが発生
Time.newの仕様が変更されたため、上記をRuby 3.3 で実行すると no time information (ArgumentError) が発生します。
Time.new('2024', '5', '29')
複数の引数をとることは今までどおり許容されています。3.3系へアップデートを考えている方は、Time.newを使用している箇所がないか調べてみてください。
Rubyに関わる方々に感謝
noteにYJITを導入したときにも驚きましたが、今回の3.3でRubyがさらに進化し続けていることが実感できました。これもひとえにRubyを開発しているコミッターの方々やRubyを支えるコミュニティのみなさまのおかげです。2014年からRubyを使い続けてきてよかったと思える出来事でもありました。
noteはRubyのバージョンを恒常的にアップデートし続けることにより、高いパフォーマンスを保ち、セキュアな環境を保つようにしています。高速で安全なプロダクトを運用することで、よりよい創作ができる世界をRubyとともにつくっていきたいと思います。
▼noteの技術記事がもっと読みたい方はこちら