我想在 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]
所以我想问一下还有什么需要我做的吗? ruby -v
输出是否表示YJIT已启用?
rustc
是 YJIT 工作的运行时依赖项吗?因为我当前的设置不包括它。
+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),虽然并不总是更快响应时间看起来通常会快一点。