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





Утечка памяти - проблема в текущей реализации Ruby.
http://whytheluckystiff.net/articles/theFullyUpturnedBin.html Сайт почему theluckystiff больше не существует, но вы можете найти оригинальную статью здесь: 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
Несколько советов по поиску утечек памяти в Rails:
Первый - это графическое исследование использования памяти объектами в ObjectSpace.
Последние два помогут вам определить конкретные шаблоны использования, которые увеличивают использование памяти, и вы можете работать оттуда.
Что касается конкретных шаблонов кодирования, по опыту вы должны наблюдать за всем, что связано с файловым io, обработкой изображений, работой с массивными строками и тому подобным.
Я бы проверил, используете ли вы наиболее подходящую библиотеку XML - ReXML, как известно, медленный и негерметичный (у меня нет доказательств этого!). Также проверьте, можно ли запоминать дорогостоящих операций.
Супер простой метод регистрации использования памяти после или перед каждым запросом (только для 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
Затем просто контролируйте верхнюю часть, когда запрос заставляет ваше использование памяти скачкообразно, иди проверьте журналы. Это, конечно, поможет только в том случае, если у вас есть утечка памяти, которая происходит большими скачками, а не маленькими приращениями.
откуда метод log_ram?
в OSX вы можете использовать vmmap # {Process.pid}
Переключитесь на jruby и используйте Анализатор памяти Eclipse. На данный момент для Ruby нет сопоставимого инструмента.
Теперь вы можете запустить следующее, чтобы получить память в формате, который может читать R. Я предполагаю, что ваша строка журнала выглядит так:
1234567890 RAM USAGE: 27456K
Запустите это (или измените на набор):
$ grep 'RAM USAGE' fubar.log | awk '{print s " " " " ; 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
и получите красивый график.
Вы должны взглянуть на рубин-проф.
Эти драгоценные камни сработали на меня:
Adds in proccess id and memory usage in your rails logs, great for tracking down memory leaks
Log parser to identify actions which significantly increase VM heap size
Сообщение для Bleak House написано в 2007 году, это все еще актуальный вариант сегодня?