mor*_*man 13 ruby memory gem ruby-on-rails bundler
我有一个带捆绑器的Rails 2.3.10应用程序.在启动时,内存占用量非常大(开发模式下为300MB).
我想看看每个gem启动时需要多少内存.
jfr*_*prr 19
我们遇到了一个问题,我们的基本Rails应用程序在没有流量或请求的情况下,启动时占用的空间大约为140MB.
我们使用以下方法来跟踪我们的应用程序的Gemfile中指定的每个gem的内存需求,而无需尝试修补bundler.
rails new myappname
生成一个新的空rails应用程序bundle install
然后rails server
确保可以启动rails服务器并加载所需的任何基本配置require: false
在每行的末尾附加.确保使用一个名称但使用:require =>'othergemname'指定的任何其他gem使用较旧的ruby Hash表示法,以便下面的模式匹配将捕获它.bundle install
再次运行以重新生成Gemfile.lock创建以下脚本,该脚本将手动使用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)跑 rails c
load 'require_and_profile.rb'
这有助于我们确定,例如,当我们只需要在:资产组中时,我们一直要求在启动时进行资产同步.我们确实发现,在不同的启动时,每个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所包含的内存量.