簡體   English   中英

如果我使用的是 Heroku buildpack,是否需要使用 jemalloc 構建 Ruby 並使用 gem?

[英]Do I need to build Ruby with jemalloc and use the gem if I'm using a Heroku buildpack?

示例Ruby (2.4.1) on Rails (4.2.8)應用程序,使用 Puma 配置並部署在Heroku (cedar-16)上。 目前在Mojave 10.14.5 MBP 上開發。 我的任務是減少 memory 的使用,最近通過這篇文章發現了 jemalloc。 我重新安裝了 Ruby(使用 RVM)並啟用了 jemalloc,如以下 output - -lpthread -ljemalloc -lgmp -ldl -lobjc所證明的那樣。 我繼續添加jemalloc gem和 bundle 安裝沒有問題。 我還設置了Heroku buildpack並配置了必要的環境變量。

但是,使用我的 Gemfile 中的 gem,我無法運行任何 rake/rails 命令 - rails c返回以下錯誤,然后我的 Mac 的粉絲立即啟動:

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

foreman start卡在* Preloading application 如果我刪除 gem,所有問題都會消失並且應用程序可以正常工作。

由於我不了解 Heroku 構建包的工作方式以及該特定構建包的精確編程方式,因此我的問題如下:

  1. 添加 buildpack 后,我真的需要在項目中安裝 gem 嗎?
  2. 添加 buildpack 后,是否需要使用 jemalloc 編譯的 Ruby 版本?
  3. 如果我確實需要 gem,我該如何擺脫上述錯誤?

malloc gem 上一次發布是在 5 年前,它捆綁了一個相當舊版本的 jemalloc lib(v3.4,目前我們有 v5.2)。 gem 所做的就是在執行 ruby 二進制文件之前將 jemalloc lib 添加到LD_PRELOAD (或 mac os 上的DYLD_INSERT_LIBRARIES )。 如果 ruby 是針對帶有--with-jemalloc標志的 jemalloc 庫構建的,則不需要它。

所以回答你的問題:

  1. 添加 buildpack 后,我真的需要在項目中安裝 gem 嗎?

不,buildpack 會在部署到 heroku 時自動為您處理一切。 實際上,如果你有 gem,jemalloc 版本沖突可能會出現問題。

  1. 添加 buildpack 后,是否需要使用 jemalloc 編譯的 Ruby 版本?

為當地發展? 技術上沒有。 但我建議您使用與生產中使用的完全相同的 ruby 版本以避免意外。

  1. 如果我確實需要 gem,我該如何擺脫上述錯誤?

你不需要寶石。 您可以通過使用--with-jemalloc標志(如您所做的那樣)重建 ruby 來啟用 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 列表?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM