ruby-on-rails ruby memory memory-leaks coding-style

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:

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.




Estas gemas funcionaron para mí:

MemoryLogic

Agrega el id de proceso y el uso de la memoria en los registros de sus rieles, ideal para rastrear fugas de memoria

Oink

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.