Почему так сложно профилировать память в рубине? - программирование
Подтвердить что ты не робот

Почему так сложно профилировать память в рубине?

Или, вернее, почему нет лучших инструментов для профилирования памяти в ruby, в частности, для приложений rails?

Недавно наше приложение rails (размещенное на heroku) начало видеть много ошибок R14 в рабочих динамиках. Это означает, что у нас заканчивается память. Нагнетание динамиков на 2x (512 Мб → 1 ГБ) лишь временно устранило проблему, что привело меня к мысли, что где-то есть утечка памяти. Естественно, моим следующим шагом было найти хороший профилирующий камень, который поможет мне обнаружить источник утечки.

Возможно, я просто не осведомлен о доступных инструментах, или, может быть, просто не знаю, как использовать те, которые у меня есть. Мое желание состоит в том, что я могу установить драгоценный камень, а затем запустить отчеты по статистике использования памяти. Нахождение конечной точки для получения отчета нецелесообразно, так как проблемы с памятью изолированы от рабочих динозанов, выполняющих отложенные задания.

Я просмотрел memprof, но только 1.8.

Я просмотрел ruby-prof (удивительный), но для профилирования памяти требуется исправленный рубиновый intrereter.

Я просмотрел GC:: Profiler, но я не понимаю, как найти утечки памяти с ним.

Итак, просто трудно найти утечки памяти в рубине? Или я что-то пропущу?

4b9b3361

Ответ 1

В зависимости от вашего типа утечки вы можете запустить valgrind против ruby. Возможно, потребуется повторная компиляция. В общем, это сложно, потому что Ruby делает выделение методов без каких-либо событий, по умолчанию, поэтому сложно отслеживать. См. Также perftools.rb project, который несколько работает вокруг этого ограничения.

Ответ 2

Недавно у меня был некоторый успех с Skylight, чтобы профилировать методы веб-поиска и фона, а затем искать возможности для оптимизации. Вероятно, этого не было, когда вы разместили этот вопрос. Недостатком является то, что он действительно помогает вам отлаживать процесс постановки или производства, а не среды разработки, поэтому цикл dev может быть очень медленным.

Убедитесь, что вы установите skylight-ruby и sidekiq-skylight, чтобы получить профилирование как для вашего веб-сервера, так и для фоновых работников, если вы используете Sidekiq.

Удачи!

Ответ 3

Я не согласен с тем, что профилирование памяти в Ruby сложно. JVM имеет одни из лучших инструментов для профилирования памяти на планете, и вы можете запускать свои программы Ruby на JVM. Не изобретайте велосипед.