문제

Ruby gems 메모리 사용량을 프로파일링해야 합니다. 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에서 보석 메모리 공간을 측정하는 더 깔끔한 접근 방식이 있습니까?

내 코드 개선에 대한 힌트가 있나요?

도움이 되었습니까?

해결책

네, 루비 스택입니다.노력하다

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

비슷한 결과를 얻었습니다.

내 것은:144512K

대신 다음을 실행하면:

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

당신은 더 적은 가치를 가지고 있습니다:27788K (광산)

무슨 일이 일어나고 있는지 더 잘 조사하려면 irb로 돌아가세요.

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

추적이 필요할 때 padrino IRB 내부에 lib를 로드합니다.

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

결과를 확인하세요.

다른 팁

Windows 개발자의 경우:좀 보세요 https://github.com/ruby-prof/ruby-prof 보석.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top