Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to profile garbage collection in Ruby

I'm trying to profile GC in a non-Rails application, preferably using YARV Ruby.

perftools.rb is telling me that the majority of my CPU time is spent in garbage_collector (6061 (61.4%)).

I'm also able to get how many objects are created by which methods with perftools.rb . Some methods create more objects than others, but it's not extremely skewed.

Where do I go from here? Is it possible to get more detailed information on why it's spending so much time doing GC? Is it possible to see whether the time is spent getting rid of objects, or whether it is spent checking whether an object should be garbage collected or not?

I have access to OS X Lion, Windows 7 and Ubuntu 12.04.

like image 495
Andrew Grimm Avatar asked Nov 14 '22 02:11

Andrew Grimm


1 Answers

On osx you have dtrace. There are dtrace providers in YARV ruby.

You have a couple of probes related to GC that you can use:

gc-begin gc-end gc-mark-begin gc-mark-end gc-sweep-begin gc-sweep-end

I think they can help finding what the GC in your program is doing. have a look at this file to see how use them: https://github.com/tenderlove/ruby/blob/probes/test/dtrace/test_gc.rb.

And this post for more explanations: http://tenderlovemaking.com/2011/06/29/i-want-dtrace-probes-in-ruby.html

There's a bug opened in ruby http://bugs.ruby-lang.org/issues/2565 where you can find a patch to apply to ruby to have those probes or you can use https://github.com/tenderlove/ruby/tree/probes where the patch is already applied.

Hope this helps

like image 66
hellvinz Avatar answered Dec 30 '22 11:12

hellvinz