[Ruby] Memory profiling with Rails
Scott Laird
scott at sigkill.org
Wed Aug 16 10:59:00 PDT 2006
On 8/15/06, Ryan Davis <ryand-ruby at zenspider.com> wrote:
>
> On Aug 15, 2006, at 11:50 AM, Scott Laird wrote:
>
> > One of the big things looming on the Typo Development Horizon is
> > reducing our memory footprint. Even after closing all of the known
> > leaks, Typo is still growing too big--I've seen 60 MB dispatchers
> > after a couple days' use.
> >
> > Does anyone have any suggestions on how to best profile memory use
> > within Rails? I'm planning on using something like this:
> >
> > http://raggle.org/pipermail/raggle-dev/2003-August/000086.html
> >
> > But I'd love to discover that someone has a better tool for Ruby
> > memory tracking. Even if it requires patching Ruby itself or
> > something similarly difficult.
>
> When I've done memory profiling it consisted of 1 thread, 2 hashes
> (curr, prev), classes as keys, and fixnums as values. No extra memory
> required if I can help it. Keep it as simple as possible. The code at
> the link above is WAY to complex for such a simple task. Try
> something like:
>
> def memory_profiler
> Thread.new do
> prev = Hash.new(0)
> curr = Hash.new(0)
> loop do
> curr.clear
> ObjectSpace.each_object do |o|
> curr[o.class] += 1
> end
>
> curr.each do |k,v|
> curr[k] -= prev[k]
> end
>
> puts "Top 20"
> curr.sort_by { |k,v| -v }[0..19].each do |k,v|
> printf "%+5d: %s\n", v, k.name unless v == 0
> end
>
> prev.clear
> prev.update curr
> sleep 2
> end
> end
> end
>
> It does use a sort_by, so that produces a bit extra junk... but that
> shouldn't be more than an extra array and hash per iteration.
Thanks, this helps. I made a few small changes, and it looks like
Typo's action cache is leak-free, but non-cached pages leak a couple
strings per hit. I'm sure that'll be a lot of fun to find :-(.
Scott
More information about the Ruby
mailing list