Подтвердить что ты не робот

Рубиновое/рубиновое обнаружение утечки памяти на рельсах

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

для более конкретного ответа на проблемы с долго запущенными процессами ruby см. https://just.do/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/

может быть, вы могли бы попробовать пассажиру (mod_rails) https://web.archive.org/web/20130901072209/http://nubyonrails.com/articles/ask-your-doctor-about-mod_rails

Ответ 4

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

Ответ 5

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

Ответ 6

Теперь вы можете запустить следующее, чтобы получить память в формате, который 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

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

Ответ 7

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

MemoryLogic

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

Oink

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