El uso de la memoria aumenta con Ruby 2.1 en comparación con Ruby 2.0 o 1.9

Recientemente implementé una actualización de Ruby de 2.0 a 2.1.5 a mi aplicación web Heroku, y ahora estoy constantemente cometiendo errores de cuota de memoria, mientras que con 2.0 y 1.9 esto nunca sucedió. Hay un límite de 512 MB para un Heroku Dyno normal, y estoy ejecutando 2 procesos con Unicorn, junto con un hilo con Sidekiq en dos días.

Después de leer el aumento del consumo de memoria de Phusion Passenger de 1.9.3 (sistema) a 2.1.2 (RVM) en Ubuntu , intenté establecer la variable de entorno RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR en 0.9 para deshabilitar el recolector de basura generacional, y mejoró un poco el consumo de memoria, pero aún se dejó No estoy ni cerca de lo que consumía 2.0 o 1.9. Como la memoria ahora es mi principal preocupación, me gustaría ver si puedo solucionar este problema con ruby ​​2.1.x en lugar de volver a 2.0.

Aquí hay algunos gráficos que demuestran el problema:

Justo antes de las 2 pm, bajé de categoría a Ruby 2.0.0-p598 a Ruby 2.1.5 y los problemas de memoria se resolvieron y quedaron por debajo del límite.

Pasando de 2.1.5 a 2.0.0 Heroku.pasando de 2.1.5 a 2.0.0 New Relic

Luego, más tarde, intenté actualizar a Ruby 2.1.5, pero configuré la variable de entorno RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR en 0.9. Como puede ver, el uso de la memoria es ligeramente mejor que el gráfico original 2.1.5, pero aún así rompe la cuota de memoria.

<img src="http://sofes.miximages.com/ruby-on-rails/Ct9Gh.png" alt="pasar de 2.0.0 a 2.1.5 con RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR a 0.9 Heroku”><img src="http://sofes.miximages.com/ruby-on-rails/pCA5L.png" alt="pasar de 2.0.0 a 2.1.5 con RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR a 0.9 New Relic”>

Así que la respuesta es claramente actualizar a Ruby versión 2.2.

Estoy impresionado de ver que el uso de la memoria ha disminuido luego de la actualización a 2.2, mientras que la actualización a 2.1 fue un gran aumento en el consumo de memoria. Vea la gráfica a continuación.

Uso de memoria con 2.2

En el extremo izquierdo, el consumo de memoria en 2.0 se ubica en alrededor de 386 mb cuando está bajo carga, mientras que con 2.2 ahora está en alrededor de 365 mb.

Este es un problema conocido con Ruby (versiones 2.1.x) y su recolección de basura. Después de leer un par de foros / publicaciones de blog, parece que no hay una solución real, sino hacer uno de los siguientes:

  • bajar a ruby ​​2.0 y esperar a que se lance ruby ​​2.2
  • use el asesino del trabajador unicornio para reiniciar a los trabajadores unicornio una vez que scopen cierta cantidad de memoria, evitando los errores Heroku R14
  • algunos sugieren ajustar sus variables GC (ver aquí y aquí )

Aquí hay un enlace a la discusión relevante sobre ruby-lang .

Algunas personas también notaron que una fuente de los problemas podría ser la gem de NewRelic, por lo que es posible que desee actualizarlo / eliminarlo y ver si ayuda.

Créditos por algunos de los enlaces e información para chicos del foro upcase.com