Ruby / ruby ​​on rails обнаружение утечки памяти

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

  • Есть ли какие-нибудь хорошие инструменты, которые можно использовать для поиска утечек памяти в Ruby / rails?
  • Какие типы шаблонов кодирования вызывают утечку памяти в рубине?
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
45
0
35 236
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Утечка памяти - проблема в текущей реализации 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, как известно, медленный и негерметичный (у меня нет доказательств этого!). Также проверьте, можно ли запоминать дорогостоящих операций.

Сообщение для Bleak House написано в 2007 году, это все еще актуальный вариант сегодня?

pupeno 08.05.2012 16:27

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

Joshua Partogi 23.08.2010 11:07

в OSX вы можете использовать vmmap # {Process.pid}

Ryan Montgomery 26.09.2011 23:18

Переключитесь на 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

Другие вопросы по теме