如何测量每个gem在初始化时需要多少内存?

mor*_*man 13 ruby memory gem ruby-on-rails bundler

我有一个带捆绑器的Rails 2.3.10应用程序.在启动时,内存占用量非常大(开发模式下为300MB).

我想看看每个gem启动时需要多少内存.

jfr*_*prr 19

我们遇到了一个问题,我们的基本Rails应用程序在没有流量或请求的情况下,启动时占用的空间大约为140MB.

我们使用以下方法来跟踪我们的应用程序的Gemfile中指定的每个gem的内存需求,而无需尝试修补bundler.

  1. 使用rails new myappname生成一个新的空rails应用程序
  2. 将Gemfile从主项目复制到这个新的rails项目
  3. 运行bundle install然后rails server确保可以启动rails服务器并加载所需的任何基本配置
  4. 打开Gemfile,除了rails gem的规范外,require: false在每行的末尾附加.确保使用一个名称但使用:require =>'othergemname'指定的任何其他gem使用较旧的ruby Hash表示法,以便下面的模式匹配将捕获它.
  5. bundle install再次运行以重新生成Gemfile.lock
  6. 创建以下脚本,该脚本将手动使用Gemfile中指定的每个gem,并记录rails进程之前和之后消耗的系统内存.

    # require_and_profile.rb
    def require_and_profile(gemname = nil)
      unless gemname
        puts "%-20s: %10s | %10s" % ['gem','increment','total']
        return
      end
      # This is how to get memory of calling process in OS X, check host OS for variants
      memory_usage = `ps -o rss= -p #{Process.pid}`.to_i / 1024.0
      require gemname
      puts "%-20s: %10.2f | %10.2f" % [ gemname, (`ps -o rss= -p #{Process.pid}`.to_i / 1024.0 - memory_usage), (`ps -o rss= -p #{Process.pid}`.to_i / 1024.0)]
    end
    
    pattern = /^[^#]*gem[ ]*['"]([^,'"]*)['"][ ,~>0-9\.'"]*(:require[ => ]*['"]([^'"]*)['"][, ])?/
    
    require_and_profile
    File.open('Gemfile').each do |line|
      if line.match(pattern)
      if line.match(pattern)[3]
        require_and_profile line.match(pattern)[3]
      else
          require_and_profile line.match(pattern)[1]
        end
      end
    end
    
    Run Code Online (Sandbox Code Playgroud)
  7. rails c

  8. load 'require_and_profile.rb'
  9. 输出显示每个gem添加到基本应用程序足迹(增量)的数量(以MB为单位)以及包含gem(总数)后的总占用量.

这有助于我们确定,例如,当我们只需要在:资产组中时,我们一直要求在启动时进行资产同步.我们确实发现,在不同的启动时,每个gem的内存占用量并不完全相同,但运行几次会确实显示出哪些是需要大量内存的宝石的模式.


小智 12

现在使用脱轨的宝石有一种更简单的方法:

添加到您的gemfile:

gem 'derailed', group: :development
Run Code Online (Sandbox Code Playgroud)

然后在应用程序根目录的命令行中:

bundle exec derailed bundle:mem
Run Code Online (Sandbox Code Playgroud)

这将打印出每个gem所包含的内存量.