1

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

但是,使用我的 Gemfile 中的 gem,我无法运行任何 rake/rails 命令 -rails c返回以下错误,随后我的 Mac 粉丝立即启动:

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

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

由于我不知道 Heroku buildpacks 是如何工作的,以及那个特定的 buildpacks 是如何精确编程的,所以我的问题如下:

  1. 添加 buildpack 后,我真的需要在项目中安装 gem 吗?
  2. 添加 buildpack 后,我是否需要使用 jemalloc 编译的 Ruby 版本?
  3. 如果我确实需要 gem,我该如何摆脱上述错误?
4

1 回答 1

4

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

所以回答你的问题:

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

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

  1. 添加 buildpack 后,我是否需要使用 jemalloc 编译的 Ruby 版本?

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

  1. 如果我确实需要 gem,我该如何摆脱上述错误?

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

以下是完整的步骤列表:

# install jemalloc lib locally
brew install jemalloc

# reinstall ruby (with rbenv):
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.7.1
# or with rvm:
rvm reinstall 2.7.1 -C —with-jemalloc

# confirm ruby is using jemalloc (ruby >= 2.6)
ruby -r rbconfig -e "puts RbConfig::CONFIG['MAINLIBS']"
# or with ruby < 2.6
ruby -r rbconfig -e "puts RbConfig::CONFIG['LIBS']"

您可能还需要使用本机扩展重建 gem(尽管我不确定这个):请参阅此问题以了解如何执行此操作:如何获取已安装的具有本机扩展的 gem 列表?

于 2020-08-24T12:14:50.957 回答