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 构建包的工作原理以及该特定构建包的准确编程方式,因此我的问题如下:
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
\n- 添加了 buildpack 后,我真的需要在项目中安装 gem 吗?
\n
不,buildpack 在部署到 heroku 时会自动为您处理所有事情。\n实际上,如果您有 gem,则可能会出现 jemalloc 版本冲突的问题。
\n\n\n\n
\n- 添加构建包后,我是否需要使用 jemalloc 编译的 Ruby 版本?
\n
为了当地发展?从技术上讲没有。但我建议您使用与生产中使用的完全相同的 ruby 版本,以避免出现意外。
\n\n\n\n
\n- 如果我确实需要宝石,我该如何消除上述错误?
\n
你不需要宝石。您可以通过使用 flag 重建 ruby 来启用 jemalloc --with-jemalloc
(就像您所做的那样)。
这是完整的步骤列表:
\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 归档时间: |
|
查看次数: |
2412 次 |
最近记录: |