如果我使用 Heroku buildpack,我是否需要使用 jemalloc 构建 Ruby 并使用 gem?

Aay*_*ari 2 ruby rubygems ruby-on-rails heroku jemalloc

示例Ruby (2.4.1) on Rails (4.2.8)应用程序,使用 Puma 配置并部署在Heroku (cedar-16)上。目前正在Mojave 10.14.5 MBP上进行开发。我的使命是减少内存使用,最近通过这篇文章发现了 jemalloc 。我重新安装了 Ruby(使用 RVM)并启用了 jemalloc,如以下输出所示 - -lpthread -ljemalloc -lgmp -ldl -lobjc。我继续添加jemalloc gem并安装捆绑包,没有出现任何问题。我还设置了Heroku buildpack并配置了必要的环境变量。

然而,使用 Gemfile 中的 gem,我无法运行任何 rake/rails 命令 -rails c返回以下错误,紧接着我的 Mac 风扇就开始启动:

ruby(45487,0x10739c5c0) malloc: *** malloc_zone_unregister() failed for 0x7fff94a3f000

foreman start卡在* Preloading application. 如果我删除宝石,所有问题都会消失并且应用程序可以正常工作。

由于我不了解 Heroku 构建包的工作原理以及该特定构建包的准确编程方式,因此我的问题如下:

  1. 添加了 buildpack 后,我真的需要在项目中安装 gem 吗?
  2. 添加构建包后,我是否需要使用 jemalloc 编译的 Ruby 版本?
  3. 如果我确实需要宝石,我该如何消除上述错误?

ppi*_*icz 7

malloc gem 上次发布是在 5 年前,它捆绑了一个相当旧版本的 jemalloc lib(v3.4,目前我们有 v5.2)。 \ngem 所做的就是在执行之前将 jemalloc lib 添加到LD_PRELOAD(或DYLD_INSERT_LIBRARIES在 mac os 上) ruby 二进制文件。\n如果 ruby​​ 是针对 jemalloc 库构建的,则不需要--with-jemalloc

\n

所以回答你的问题:

\n
\n
    \n
  1. 添加了 buildpack 后,我真的需要在项目中安装 gem 吗?
  2. \n
\n
\n

不,buildpack 在部署到 heroku 时会自动为您处理所有事情。\n实际上,如果您有 gem,则可能会出现 jemalloc 版本冲突的问题。

\n
\n
    \n
  1. 添加构建包后,我是否需要使用 jemalloc 编译的 Ruby 版本?
  2. \n
\n
\n

为了当地发展?从技术上讲没有。但我建议您使用与生产中使用的完全相同的 ruby​​ 版本,以避免出现意外。

\n
\n
    \n
  1. 如果我确实需要宝石,我该如何消除上述错误?
  2. \n
\n
\n

你不需要宝石。您可以通过使用 flag 重建 ruby​​ 来启用 jemalloc --with-jemalloc(就像您所做的那样)。

\n

这是完整的步骤列表:

\n
# install jemalloc lib locally\nbrew install jemalloc\n\n# reinstall ruby (with rbenv):\nRUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.7.1\n# or with rvm:\nrvm reinstall 2.7.1 -C \xe2\x80\x94with-jemalloc\n\n# confirm ruby is using jemalloc (ruby >= 2.6)\nruby -r rbconfig -e "puts RbConfig::CONFIG[\'MAINLIBS\']"\n# or with ruby < 2.6\nruby -r rbconfig -e "puts RbConfig::CONFIG[\'LIBS\']"\n
Run Code Online (Sandbox Code Playgroud)\n

您可能还需要使用本机扩展重建 gem(尽管我不确定这一点):\n请参阅此问题以了解如何执行此操作:How do I get a list of gems that is Installed that has native extensions?

\n

  • 非常感谢。我会注意到,确认步骤似乎对我在 Heroku 上不起作用。相反,我使用了`MALLOC_CONF=stats_print:true ruby​​ -e "exit"`(来自[这个答案](/sf/answers/4261854901/))。 (2认同)