2008-10-02 11 views
44

Escribí una pequeña aplicación web que usa ruby ​​on rails, su propósito principal es cargar, almacenar y mostrar resultados de archivos xml (archivos hasta varios MB). Después de correr durante aproximadamente 2 meses, noté que el proceso mongrel usaba aproximadamente 4GB de memoria. Hice algunas investigaciones sobre la depuración de fugas de memoria ruby ​​y no pude encontrar mucho. Entonces tengo dos preguntas.ruby ​​/ ruby ​​on rails detección de fuga de memoria

  • ¿Hay alguna buena herramienta que pueda usarse para encontrar fugas de memoria en Ruby/rails?
  • ¿Qué tipo de patrones de codificación ocasionan fugas de memoria en ruby?

Respuesta

37

Algunos consejos para encontrar fugas de memoria en Rails:

La primera es una exploración gráfica del uso de memoria por objetos en ObjectSpace.

Los dos últimos le ayudarán a identificar patrones de uso específicos que están inflando el uso de la memoria, y puede trabajar desde allí.

En cuanto a los patrones de codificación específicos, por experiencia tiene que ver todo lo relacionado con el archivo io, el procesamiento de imágenes, el trabajo con cadenas masivas y similares.

Verificaría si está utilizando la biblioteca XML más adecuada: se sabe que ReXML es lento y se cree que tiene fugas (¡no tengo pruebas de eso!). También verifique si puede memoize operaciones costosas.

+1

la "memoria sencilla el uso de registrador" se ha trasladado a memorylogic: http://github.com/binarylogic/memorylogic/tree/master – semanticart

+0

Esta respuesta acaba de ayudar a resolver mi pérdida de memoria. Gracias +1 – DanSingerman

+1

No creo que haya oído hablar de alguien construyendo con éxito la página de instalación de _blook_house en OSX (estoy en 10.5.8). ¿Alguien sabe de una * receta * de trabajo? – conny

6

pérdida de memoria es un problema en la implementación actual rubí un buen punto de partida de todo esto es http://whytheluckystiff.net/articles/theFullyUpturnedBin.html página web Whytheluckystiff ya no existe, pero se puede encontrar el artículo original aquí: http://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

de una respuesta más específica sobre los problemas con los procesos que se ejecutan a largo rubí ver http://zdavatz.wordpress.com/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/

tal vez usted podría dar pasajeros (mod_rails) una oportunidad http://nubyonrails.com/articles/ask-your-doctor-about-mod_rails

15

Un método super simple para registrar el uso de la memoria antes o después de cada solicitud (solo para 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 

Es posible que desee cargar el script/consola y probar el enunciado primero para asegurarse de que funciona en su caja.

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

Luego solo supervise la parte superior, cuando una solicitud hace que su uso de memoria salte, vaya a revisar los registros. Esto, por supuesto, solo ayudará si tiene una pérdida de memoria que ocurre en saltos grandes, no pequeños incrementos.

+0

¿de dónde es el método log_ram? –

+0

Acabo de crearlo. Es solo una línea, como se muestra arriba. –

+6

en osx puede usar vmmap # {Process.pid} –

2

Ahora, puede ejecutar las siguientes acciones para conseguir la memoria en un formato que R puede leer. Estoy asumiendo que su línea de registro se parece a:

1234567890 RAM USAGE: 27456K 

Ejecutar este (o modificar a la suite):

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

continuación, puede ejecutar esto:

#!/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 

y obtener un buen grafico.

0

Estas gemas trabajaron para mí:

MemoryLogic

añade en el identificador de proceso y el uso de memoria en sus carriles troncos, ideal para localizar pérdidas de memoria

Oink

Analizador de registros para identificar acciones que signif icantly aumentar tamaño de la pila VM