У меня есть приложение Rails 2.3.10 со связкой. При запуске объем памяти довольно большой (300 МБ в режиме разработки).
Я хотел бы посмотреть, сколько памяти занимает каждый самолёт при запуске.
У меня есть приложение Rails 2.3.10 со связкой. При запуске объем памяти довольно большой (300 МБ в режиме разработки).
Я хотел бы посмотреть, сколько памяти занимает каждый самолёт при запуске.
У нас возникла проблема, в которой наше основное приложение Rails без трафика или запросов имело размер 140 МБ при запуске.
Мы использовали следующий подход для отслеживания потребности в памяти каждого драгоценного камня, указанного в Gemfile нашего приложения, без необходимости пытаться установить патч.
rails new myappname
создайте новое пустое приложение railsbundle install
, а затем rails server
, чтобы обеспечить загрузку сервера rails и необходимость загрузки любых основных конфигураций.require: false
в конце каждой строки. Убедитесь, что любые другие драгоценные камни, которые указаны с одним именем, но требуемые с помощью: require = > 'othergemname', используют более раннюю нотацию рубинового хеша, так что шаблон, соответствующий ниже, будет его поймать.bundle install
снова, чтобы восстановить Gemfile.lockСоздайте следующий script, который будет вручную использовать каждый камень, указанный в Gemfile, и регистрирует системную память, потребляемую процессом 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
Запустите rails c
load 'require_and_profile.rb'
Это помогло нам идентифицировать, например, что нам требовалась актива-синхронизация в нашей загрузке, когда мы нуждались в ней только в группе:. Мы находим, что при разных загрузках объем памяти каждого драгоценного камня не совсем то же самое, но несколько раз он запускает его, показывает, какими из них являются голодные драгоценные камни.
Существует более простой способ сделать это сейчас с отброшенной жемчужиной:
добавить в свой gemfile:
gem 'derailed', group: :development
затем в командной строке из корня приложений:
bundle exec derailed bundle:mem
Это будет печатать, сколько памяти занимает каждая драгоценность, включая ее.
Я бы сделал это следующим образом:
c = 0; ObjectSpace.each_object { c += 1 }
)Таким образом вы увидите, какая жемчужина вызывает большинство объектов, которые создаются, и поэтому косвенно вызывает большую часть использования памяти.
Два оговорки: