ruby-on-rails - servicios - ventajas de heroku
¿Cómo puedo encontrar una pérdida de memoria en Heroku? (2)
El GC debe hacer la limpieza, y probablemente lo haga.
Puede forzar el GC con GC.start
; Si no se recolectaron muchos objetos esta voluntad, pero sospecho que no es el problema.
¿Es posible que de alguna manera crees un montón de objetos y nunca los liberes, manteniendo copias en caché o algo así?
No estoy familiarizado con las herramientas existentes para verificar esto, pero es posible que desee verificar qué objetos existen utilizando ObjectSpace
. Por ejemplo:
ObjectSpace.each_object.with_object(Hash.new(0)){|obj, h| h[obj.class] +=1 }
# => a Hash with the number of objects by class
Si obtienes un número inesperado para una de tus clases, por ejemplo, tendrías una mejor idea de dónde buscar.
Tengo una aplicación Rails 3.2.8 que se ejecuta en Heroku Cedar con Ruby 1.9.3. La aplicación funciona bien cuando se inicia, pero después de un día o más de uso continuo, comienzo a ver errores R14 en mis registros. Una vez que comienzan los errores de memoria, nunca desaparecen, incluso si la aplicación está inactiva durante varias horas.
¿No debería el recolector de basura limpiar los objetos no utilizados después de un tiempo y reducir la carga de memoria? Parece que esto no está sucediendo en Heroku. En general, el uso de la memoria comienza a aumentar después de ejecutar algunos informes con varios miles de filas de datos, aunque los resultados están paginados.
¿Cómo puedo encontrar la pérdida de memoria? Los complementos como bleak_house están desactualizados o no funcionan bien en el entorno Heroku. ¿Puedo ajustar la configuración del GC para hacerlo más agresivo?
Instala el complemento New Relic. Tiene un montón de métricas útiles que puede usar para averiguar la fuente de la fuga. Creo que, en general, es una mejor idea tratar de ver qué parte del código tarda más tiempo en ejecutarse y tal vez intentar optimizar eso, en lugar de modificar el GC directamente.
Algunas de las características interesantes que incluye New Relic son la posibilidad de identificar la fuente de la consulta SQL de mayor duración, por ejemplo. Te animo a que lo pruebes.