2008-10-02 4 views
44

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

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

ответ

37

Некоторые советы, чтобы найти утечки памяти в Rails:

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

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

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

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

+1

«простой памяти использование регистратор» переехал в memorylogic: http://github.com/binarylogic/memorylogic/tree/master – semanticart 2009-07-09 20:59:54

+0

Этот ответ только помог мне решить мою утечку памяти. Спасибо +1 – DanSingerman 2009-08-19 13:22:47

+1

Я не думаю, что когда-либо слышал о том, что кто-то успешно строил bleak_house на OSX (я на 10.5.8). Кто-нибудь знает о * рабочем * рецепте? – conny 2010-04-01 15:04:41

6

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

для более конкретный ответ на проблемы, с длинными запущенными процессами рубина см 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

15

Супер простой способ записывать использование памяти после или после каждого запроса (только для 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 

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

2

Переключить на jruby и использовать Eclipse Memory Analyzer. В настоящее время на Ruby нет сопоставимого инструмента.

2

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

1234567890 RAM USAGE: 27456K 

Выполнить это (или изменить в ванной):

$ 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 

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

0

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

MemoryLogic

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

Oink

Лог-парсер для определения действий, которые означают icantly увеличить VM размер кучи