detección de fuga de memoria ruby/ruby on rails
ruby-on-rails memory (7)
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 <<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 consigue un buen gráfico.
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 fugas de memoria ruby y no pude encontrar mucho. Entonces tengo dos preguntas.
- ¿Hay alguna buena herramienta que se pueda usar para encontrar fugas de memoria en Ruby / rails?
- ¿Qué tipo de patrones de codificación causan filtraciones de memoria en ruby?
Algunos consejos para encontrar fugas de memoria 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 codificación 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 memoize operaciones costosas.
Cambie a jruby y use el Eclipse Memory Analyzer . No hay una herramienta comparable para Ruby en este momento.
Deberías echarle un vistazo a ruby-prof .
Estas gemas funcionaron para mí:
Agrega el id de proceso y el uso de la memoria en los registros de sus rieles, ideal para rastrear fugas de memoria
Analizador de registro para identificar acciones que aumentan significativamente el tamaño del almacenamiento dinámico de VM
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 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/ in-a-long-running-ruby- 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
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 declaración 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.