フォーム読み込み中
AWSのLambdaのRuby 3.2 ランタイムから、Ruby JIT(Just-in-Time) コンパイラである YJIT(Yet Another JIT)がサポートされました。YJITは、RubyのJITコンパイラの一つです。JITは実行時にコードをネイティブのバイナリに変換するコンパイルです。その結果、プログラムの実行速度を向上させることができます。
AWSのLambdaで試してみます。
AWS公式ドキュメント上にある通り、一般的な手順でLambdaを作成すればよいです。
Ruby 関数を作成手順
ランタイムとして、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が、ますます高速化される状況は嬉しいですね。
ソフトバンクはAWS アドバンストティアサービスパートナーです。「はじめてのAWS導入」から大規模なサービス基盤や基幹システムの構築まで、お客さまのご要望にあわせて最適なAWS環境の導入を支援します。
条件に該当するページがございません