ruby-on-rails 在Rails项目上启用YJIT(是否需要rust?)

jk9hmnmh  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(157)

我想在Rails项目上启用YJIT。我已经将代码库移到了Ruby 3.2,并试图通过在一个接收50%流量的金丝雀版本中将RUBY_YJIT_ENABLE设置为1来启用YJIT,这样我就可以并排看到两者。在canary版本中,设置了env var,当我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]

不幸的是,我没有看到others are reporting的性能优势。下面您可以看到两个图表,一个是内存使用情况,另一个是请求的平均请求时间。在这两个图中,蓝色是启用YJIT的金丝雀版本,黄色是禁用YJIT的版本(都是ruby 3.2)。

所以我想问一下,我还需要做什么吗?ruby -v输出是否意味着启用了YJIT?
rustc是YJIT工作的运行时依赖项吗?因为我现在的系统不包括它。

at0kjp5o

at0kjp5o1#

我的理解是,+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),虽然并不总是更快,但响应时间看起来往往更快。

相关问题