require 호출 시 Ruby 메모리 사용량을 프로파일링하는 중
문제
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 보석.
제휴하지 않습니다 StackOverflow