Профилирование использования памяти ruby ​​при требовании вызова

Мне нужно профилировать использование памяти рубиновых драгоценных камней. https://stackoverflow.com/a/164206/391229 предлагает использовать системный вызов для измерения объема памяти, поэтому в итоге метод псевдонимов require и сбор статистики.

Вверху скрипта запуска (в моем случае это /usr/bin/padrino):

$memstat = {}
$memusage = `pmap #{Process.pid} | tail -1`[10,40].strip.to_i
$memstat['base'] = $memusage

alias :old_require :require
def require *args
  result = old_require *args
  oldmem = $memusage
  $memusage = `pmap #{Process.pid} | tail -1`[10,40].strip.to_i
  delta = $memusage - oldmem
  $memstat[args[0]] ||= 0
  $memstat[args[0]] += delta
  result
end

Событие после загрузки всего (Padrino.after_load):

stat = $memstat.select{ |k,v| v>0 }.to_a.sort{ |a,b| a[1]<=>b[1] }
summ = 0
stat.each do |row|
  summ += row[1]
  puts "#{row[1].to_s.rjust(7)} KB: #{row[0]}"
end
puts summ.to_s.rjust(7) + ' KB'

Результат, который я получаю при вызове padrino console:

        ...
   2120 KB: redcarpet.so
   2184 KB: socket.so
   2220 KB: etc
   2332 KB: addressable/idna/pure
   2740 KB: strscan
   2992 KB: haml/buffer
   3508 KB: pathname
   4240 KB: psych.so
   4252 KB: digest.so
   6028 KB: /home/ujif/swift/admin/app.rb
   6292 KB: zlib
   6704 KB: readline
   9116 KB: openssl.so
  12408 KB: do_mysql/do_mysql
  28164 KB: base
 145648 KB

Вопросы:

Есть ли способ покопаться в base следах?

Есть ли какой-нибудь более чистый подход для измерения объема памяти драгоценных камней на MRI ~> 1.9.2?

Есть какие-нибудь подсказки по улучшению моего кода?


person ujifgc    schedule 25.02.2012    source источник


Ответы (2)


Ага, это рубиновая стопка. Пытаться

$ irb
>> `pmap #{Process.pid} | tail -1`

У тебя аналогичный результат.

Мой: 144512K

Вместо этого, если вы запустите:

$ ruby -e 'system "pmap #{Process.pid} | tail -1"'

У вас меньшее значение: 27788К (у меня)

Итак, чтобы лучше понять, что происходит, вернитесь в irb

$ irb
>> puts `pmap #{Process.pid}`

Когда вам нужно отслеживать padrino deps, загрузите вашу библиотеку внутри irb

$ cd my_padrino_project
$ irb -r /path/to/my/lib.rb
>> require_relative 'config/boot'

и проверьте свои результаты.

person DAddYE    schedule 25.02.2012

Для разработчиков Windows: взгляните на https://github.com/ruby-prof/ruby-prof gem.

person peter    schedule 31.03.2016