在 Rails 项目上启用 YJIT(需要 Rust 吗?)

问题描述 投票:0回答:1

我想在 Rails 项目上启用 YJIT。我已将代码库移至 Ruby 3.2,并尝试通过在接收 50% 流量的金丝雀版本中将

RUBY_YJIT_ENABLE
设置为
1
来启用 YJIT,以便我可以并排看到两者。 在金丝雀版本中,设置了环境变量后,当我通过 SSH 进入生产环境时,我得到:

~/app $ env | grep YJIT
RUBY_YJIT_ENABLE=1
~/app $ ruby -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) +YJIT [x86_64-linux-musl]

不幸的是,我没有看到其他人报告的性能优势。下面您可以看到两张图,一张显示内存使用情况,一张显示请求的平均请求时间。在两张图中,蓝色是启用了 YJIT 的金丝雀版本,黄色是禁用了 YJIT 的版本(均为 ruby 3.2)。

所以我想问一下还有什么需要我做的吗?

ruby -v

输出是否表示YJIT已启用?

rustc

 是 YJIT 工作的运行时依赖项吗?因为我当前的设置不包括它。

ruby-on-rails jit yjit
1个回答
0
投票
据我了解,

+YJIT

表示YJIT已启用。我找不到任何官方文档可供参考,但看起来 
rustc
 是 Ruby 3.2 的编译时依赖项,但不是运行时依赖项。我使用 docker 镜像 
ruby:3.2.2-alpine3.18
,它只有 33MB,因为它使用 C 编译 Ruby,使用 Rust 编译 YJIT。然后,它仅复制 Ruby 二进制文件和包含 YJIT 的依赖项。您可以使用以下命令验证 YJIT 是否确实正在运行。

docker run -it ruby:3.2.2-alpine3.18 /bin/sh RUBYOPT=--yjit irb RubyVM::YJIT.enabled? => true RubyVM::YJIT.runtime_stats => {:inline_code_size=>337228, :outlined_code_size=>337004, :freed_page_count=>0, :freed_code_size=>0, :live_page_count=>42, :code_gc_count=>0, :code_region_size=>684032, :object_shape_count=>706}
另外,看看你的图表(尽管它们缺少图例,所以我假设浅蓝色是使用 YJIT 的金丝雀),RAM 使用率较高,这是预期的权衡(RAM 与 CPU),虽然并不总是更快响应时间看起来通常会快一点。

© www.soinside.com 2019 - 2024. All rights reserved.