ruby / ruby ​​on rails обнаружение утечек памяти - PullRequest
45 голосов
/ 02 октября 2008

Я написал небольшое веб-приложение, использующее ruby ​​на рельсах, его основная цель - загружать, хранить и отображать результаты из файлов xml (файлы могут быть до нескольких МБ). После работы в течение приблизительно 2 месяцев я заметил, что процесс монгрел использовал около 4 ГБ памяти. Я провел некоторые исследования по устранению утечек памяти в рубине и не смог найти много. Итак, у меня есть два вопроса.

  • Есть ли хорошие инструменты, которые можно использовать для поиска утечек памяти в Ruby / rails?
  • Какой тип шаблонов кодирования вызывает утечку памяти в ruby?

Ответы [ 7 ]

38 голосов
/ 02 октября 2008

Несколько советов по поиску утечек памяти в Rails:

Первый - графическое исследование использования памяти объектами в ObjectSpace.

Последние два помогут вам определить конкретные модели использования, которые раздувают использование памяти, и вы можете работать оттуда.

Что касается конкретных шаблонов кодирования, то из опыта вы должны наблюдать за всем, что имеет дело с файлами ввода-вывода, обработкой изображений, работой с массивными строками и тому подобным.

Я бы проверил, используете ли вы наиболее подходящую библиотеку XML - известно, что ReXML работает медленно и считается утечкой (у меня нет никаких доказательств этого!). Также проверьте, можете ли вы запомнить дорогих операций.

17 голосов
/ 02 октября 2008

Супер простой способ регистрировать использование памяти после или перед каждым запросом (только для Linux).

#Put this in applictation_controller.rb
before_filter :log_ram # or use after_filter
def log_ram
  logger.warn 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
end

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

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip

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

6 голосов
/ 02 октября 2008

Утечка памяти - проблема в текущей реализации ruby, хорошее место, чтобы начать об этом http://whytheluckystiff.net/articles/theFullyUpturnedBin.html Почему веб-сайт thetheluckystiff больше не существует, но вы можете найти оригинальную статью здесь: http://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

Более подробный ответ о проблемах с долго запущенными процессами ruby ​​см. http://zdavatz.wordpress.com/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/

возможно, вы могли бы попробовать пассажира (mod_rails) http://nubyonrails.com/articles/ask-your-doctor-about-mod_rails

5 голосов
/ 31 августа 2012

Вы должны взглянуть на ruby-prof .

2 голосов
/ 04 марта 2010

Теперь вы можете запустить следующее, чтобы получить память в формате, который R может читать. Я предполагаю, что ваша строка журнала выглядит так:

1234567890 RAM USAGE: 27456K

Запустите это (или измените на suite):

$ grep 'RAM USAGE' fubar.log | awk '{print s " " $1 " " $4; s++}' | sed 's/K//g' > mem.log

Тогда вы можете запустить это:

#!/bin/sh
rm -f mem.png
R --vanilla --no-save --slave <<RSCRIPT
    lst <- read.table("mem.log")
    attach(lst)
    m = memory / 1024.0
    summary(m)
    png(filename="mem.png", width=1024)
    plot(date, m, type='l', main="Memory usage", xlab="time", ylab="memory")
RSCRIPT

и получите хороший график.

2 голосов
/ 10 октября 2008

Переключитесь на jruby и используйте Eclipse Memory Analyzer . На данный момент для Ruby нет аналогичного инструмента.

0 голосов
/ 18 марта 2014

Эти драгоценные камни работали для меня:

MemoryLogic

Добавляет идентификатор процесса и использование памяти в логах rails, отлично подходит для отслеживания утечек памяти

Хрю

Анализатор журнала для определения действий, которые значительно увеличивают размер кучи виртуальной машины

...