Как профилировать сборку мусора в Ruby
Я пытаюсь профилировать GC в не-Rails-приложении, желательно с использованием YARV Ruby.
perftools.rb говорит мне, что большая часть моего процессорного времени уходит на garbage_collector (6061 (61,4%)).
Я также могу узнать, сколько объектов создано какими методами с perftools.rb. Некоторые методы создают больше объектов, чем другие, но это не слишком искажено.
Куда мне идти отсюда? Можно ли получить более подробную информацию о том, почему он так много времени проводит в GC? Можно ли увидеть, потрачено ли время на избавление от объектов, или же оно потрачено на проверку того, должен ли объект собирать мусор или нет?
У меня есть доступ к OS X Lion, Windows 7 и Ubuntu 12.04.
1 ответ
На osx у вас есть dtrace. В YARV ruby есть провайдеры dtrace.
У вас есть пара зондов, связанных с GC, которые вы можете использовать:
gc-begin gc-end gc-mark-begin gc-mark-end gc-sweep-begin gc-sweep-end
Я думаю, что они могут помочь найти, что делает GC в вашей программе. взгляните на этот файл, чтобы узнать, как их использовать: https://github.com/tenderlove/ruby/blob/probes/test/dtrace/test_gc.rb.
И этот пост для более объяснений: http://tenderlovemaking.com/2011/06/29/i-want-dtrace-probes-in-ruby.html
В ruby открыта ошибка http://bugs.ruby-lang.org/issues/2565 где вы можете найти патч для применения к ruby, чтобы получить эти пробники, или вы можете использовать https://github.com/tenderlove/ruby/tree/probes, где патч уже применяется.
Надеюсь это поможет