YJIT(Yet Another Ruby JIT)をAWS Lambdaで試す

2023年12月13日掲載

governance

AWSのLambdaのRuby 3.2 ランタイムから、Ruby JIT(Just-in-Time) コンパイラである YJIT(Yet Another JIT)がサポートされました。YJITは、RubyのJITコンパイラの一つです。JITは実行時にコードをネイティブのバイナリに変換するコンパイルです。その結果、プログラムの実行速度を向上させることができます。

AWSのLambdaで試してみます

目次

YJITの有効化

AWS公式ドキュメント上にある通り、一般的な手順でLambdaを作成すればよいです。

Ruby 関数を作成手順

  1. Lambda コンソールを開きます。
  2. [機能の作成]を選択します。
  3. 以下の設定を行います。
    [Function name]: 関数名を入力します。
    [ランタイム]:[Ruby 3.2] を選択します。
  4. [機能の作成]を選択します。
  5. テストイベントを設定するには、[テスト] を選択します。
  6. [イベント名] で、「test」と入力します。
  7. [Save changes] (変更の保存) をクリックします。
  8. [テスト] を選択して関数を呼び出します。

ランタイムとして、Ruby 3.2を選ぶことだけご注意ください。ただし、初期状態ではYJITは無効になっています。RUBY_YJIT_ENABLE 環境変数に1を指定します。

YJITが有効化されているかどうかは以下のメソッドで確認できます。

puts(RubyVM::YJIT.enabled?())
# => false / true

ベンチマーク

YJITの無効、有効の速度差のベンチマークをフィボナッチ数列で計測してみます。
lambda_handlerが、lambda呼び出し時のハンドラ関数です。

require 'benchmark'

def fibonacci(n)
  return n if n <= 1 
  fibonacci(n - 1) + fibonacci(n - 2)
end


def lambda_handler(event:, context:)
  puts(RubyVM::YJIT.enabled?())

  # warm up
  fibonacci(40)

  Benchmark.bm do |x|
    x.report { fibonacci(40) }
  end 

end

YJIT無効
user     system      total        real
14.845198   0.000014  14.845212 ( 25.643160)

YJIT有効
user     system      total        real
4.635226   0.000000   4.635226 (  7.998782)

ループや再帰が中心のパターンへの最適化の効果は大きいですね。

配慮事項

CRubyのコアチームが取り込んだ機能なので、信頼して利用しても大きな問題はまず起きないと思いますが、JITを使う場合の一般的な留意点と副作用は理解しておいた方がいいでしょう。

■ その1 ウォームアップ時間も計測する
例えば、JITの効果が出るまで3分かかるとします。これでは、商用では使いにくいですね。トラフィックがあり、デプロイの回数が多い企業やアプリでは致命的になりかねません。また、ウォームアップ中の最適化中に、JITを使っていないCRubyよりも速度が低下する可能性がないか念のため探りましょう。

■ その2 改善速度だけを見ない
上に書いたことと関係しています。許容できるウォームアップ時間で期待する改善がされるかを確認します。
RubyのJIT実装には、YJIT以外にも、RJITがあります。またRubyのJava実装であるJRuby、TruffleRubyなどであれば、JVMのJITが利用できます。YJITは最速ではありません。ただし、ウォームアップ時間が早く、改善速度の効果も大きいのです。YJITは非常にバランスのとれたJITです。

■ その3 メモリの増加率も見る
先ほど名前を出した、JRuby、TuffleRubyですが、CRubyと比較して、RSSの増加率は2桁程度増えます。2割ではなく、桁が増える、です。YJITはCRubyと比べて許容できる増加率になるはずです。

参考:https://railsatscale.com/2023-11-07-yjit-is-the-most-memory-efficient-ruby-jit/

まとめ

RailsでもディフォルトでYJITが有効になるそうです。Railを開発しているBasecampのDHHは10-24%の性能向上があったとXで言及しています。

すでに、幅広いところで実用的に使える速度を出すRubyが、ますます高速化される状況は嬉しいですね。

関連サービス

Amazon Web Services (AWS)

ソフトバンクはAWS アドバンストティアサービスパートナーです。「はじめてのAWS導入」から大規模なサービス基盤や基幹システムの構築まで、お客さまのご要望にあわせて最適なAWS環境の導入を支援します。

おすすめの記事

条件に該当するページがございません