detección de fuga de memoria ruby ​​/ ruby ​​on rails

Escribí una pequeña aplicación web que usa ruby ​​on rails, su principal propósito es cargar, almacenar y mostrar resultados de archivos xml (los archivos pueden tener 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 memory leaks ruby ​​y no pude encontrar mucho. Entonces tengo dos preguntas.

  • ¿Hay alguna buena herramienta que se pueda usar para encontrar memory leaks en Ruby / rails?
  • ¿Qué tipo de patrones de encoding causan filtraciones de memoria en ruby?

Algunos consejos para encontrar memory leaks en Rails:

  • utiliza el plugin Bleak House
  • implementar Scout monitoreando específicamente el uso del perfil de memoria
  • implementar el monitoreo de FiveRuns
  • intente con otro registrador de uso de memoria simple

El primero es una exploración gráfica del uso de la memoria por parte de objetos en ObjectSpace.

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

En cuanto a los patrones de encoding específicos, a partir de la experiencia debe observar todo lo relacionado con el archivo io, el procesamiento de imágenes, el trabajo con cadenas masivas y demás.

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 memorizar operaciones costosas.

Un método súper simple para registrar el uso de memoria después o antes 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 la secuencia de comandos / consola y probar la statement primero para asegurarse de que funcione en su caja.

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

Luego solo monitoree la parte superior, cuando una solicitud haga 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.

La fuga de memoria es un problema en la implementación actual de ruby. Un buen lugar para empezar es http://whytheluckystiff.net/articles/theFullyUpturnedBin.html. Por qué el sitio web the louckystiff ya no existe pero puedes encontrar el artículo original aquí: http: / /viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

para obtener una respuesta más específica sobre los problemas con los procesos ruby ​​de larga ejecución, consulte http://zdavatz.wordpress.com/2007/07/18/heap- fragmentation- in-a-long-running-ruby- process/

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

Deberías echarle un vistazo a ruby-prof .

Cambie a jruby y use el Eclipse Memory Analyzer . No hay una herramienta comparable para Ruby en este momento.

Ahora puede ejecutar lo siguiente para obtener la memoria en un formato que R pueda leer. Supongo que su línea de registro se ve así:

 1234567890 RAM USAGE: 27456K 

Ejecuta esto (o modifica al conjunto):

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

Entonces puedes ejecutar esto:

 #!/bin/sh rm -f mem.png R --vanilla --no-save --slave < 

y consigue un buen gráfico.

Estas gems funcionaron para mí:

MemoryLogic

Agrega el id de proceso y el uso de la memoria en los registros de sus Rails, ideal para rastrear memory leaks

Gruñir

Analizador de registro para identificar acciones que aumentan significativamente el tamaño del almacenamiento dynamic de VM