2012-02-29 22 views
8

La semana pasada actualizamos un pequeño proyecto que se ejecutaba en Rails 3.0.1 a Rails 3.2.2.Gran pérdida/hinchazón de memoria después de actualizar de Rails 3.0 a Rails 3.2 (Ruby 1.9.3 + Passenger)

Poco después de la actualización, reconocimos que de vez en cuando, 2-3 veces al día, estamos viendo un gran proceso de Phusion Passenger (1-5 GB).

Estamos ejecutando Phusion Passenger 3.0.11 y Ruby 1.9.3-p0. Ya probamos diferentes versiones de Ruby (1.9.2-p290 y 1.9.3-p125) sin éxito.

Después, tratamos de rastrear nuestro uso de memoria con Oink. Desafortunadamente, Oink no muestra el motivo de la saturación de memoria: los procesos grandes ya no escriben en los archivos de registro.

Cuando retrocedimos a Rails 3.0.1, el problema desapareció. ¿Alguien tiene problemas similares? Realmente verificamos nuestro código para posibles fugas de memoria, como demasiadas instancias de ActiveRecord, pero no encontramos ninguna.

¿Crees que vale la pena probar Unicorn en lugar de Passenger? ¿O es probable que tengamos el mismo problema?

Cualquier sugerencia sobre cómo rastrear la pérdida de memoria es bienvenida. Ya configuramos newrelic, pero no muestra información detallada sobre la pérdida de memoria.

+1

Hemos reemplazado a Pasajero por una configuración de Unicornio y ahora el sistema funciona como se esperaba. No sé si fue un problema general de Pasajeros o probablemente un problema con Passenger/rvm (y tal vez cómo lo instalamos/actualizamos recientemente). –

+0

¿te importaría compartir tu configuración de unicornio? Estoy teniendo exactamente el mismo problema, ¡necesito reiniciar el servidor cada 6 horas para evitar el desbordamiento de la memoria! –

+2

Perdón por la respuesta tardía. Bueno ... compartir la configuración de unicornio sería probablemente demasiado como para publicarlo aquí. Una búsqueda rápida en Google debería ayudarte. Tal vez comiences aquí: https://github.com/blog/517-unicorn.Básicamente es solo nginx con unicornio como servidor ascendente. La configuración del unicornio es simplemente un simple unicornio.rb en config ... Nos tomó probablemente una hora para cambiar de Pasajero. Y otro para agregar cosas de implementación de unicornios a nuestra configuración de Capistrano. –

Respuesta

0

Me interesaría saber qué muestra la memoria del pasajero y qué tipo de memoria tiene configurado como pasajero para PassengerMaxPoolSize PassengerPoolIdleTime y cualquier otra configuración de pasajero.

¿Cómo actualizaste pasajero?

¿Cómo es tu configuración de apache? prefork o trabajador?

Sospecho que usted está viendo los malos resultados GC, tratar de ajustarlos al poner esto en una envoltura alrededor del rubí dicho pasajero utiliza:

#!/bin/sh 
export RUBY_HEAP_MIN_SLOTS=600000 
export RUBY_GC_MALLOC_LIMIT=59000000 
export RUBY_FREE_MIN=200000 
exec "/usr/bin/ruby" "[email protected]" 

Se debería solucionar algunos problemas de rendimiento que está viendo en general, debido a pobres valores predeterminados de ruby ​​gc.

+0

Ha pasado un tiempo desde que tuvimos este problema. Desafortunadamente, ya no conozco la configuración de Passenger, pero supongo que fueron los valores predeterminados o recomendados. Instalamos Passenger con el script de instalación predeterminado que también instaló nginx para nosotros. Como ya escribí en mi comentario anterior, solucionamos el problema usando Unicorn/nginx en lugar de Passenger/Nginx. –

1

Si se trata de Linux compatible con Red Hat, puede usar SystemTap. No estoy seguro si SystemTap está disponible en los sistemas Debian/Ubuntu, si no hay una alternativa llamada DTrace. Aquí hay algunos artículos: he tenido bastante éxito con el seguimiento de varias regresiones, aunque ninguno de estos fueron problemas de memoria (tal vez usted puede encontrar un script STP que podría hacer el truco para usted). Leer aquí:

http://lukas.zapletalovi.com/2012/02/peek-into-your-ruby-app-with-systemtap.html http://lukas.zapletalovi.com/2012/01/probing-ruby-apps-with-systemtap-in.html http://sourceware.org/systemtap/wiki/RubyMarker

El último eslabón muestra sondas puede Hoop en en SystemTaps en Ruby. Hay pensamientos como corridas de gc o asignaciones de memoria que podrían ayudarlo. ¡Buena suerte!

Cuestiones relacionadas