Planeo utilizar el trabajo retrasado para ejecutar algunos análisis de fondo. En mi prueba inicial vi una gran cantidad de uso de memoria, así que básicamente creé una tarea muy simple que se ejecuta cada 2 minutos solo para observar cuánta memoria está siendo utilizada.utiliza alto uso de memoria en rieles
La tarea es muy simple y la analytics_eligbile? método siempre devuelve falso, dado que los datos están ahora, por lo que básicamente no se está llamando al código de golpe pesado. Tengo alrededor de 200 publicaciones en mis datos de muestra en desarrollo. Publicar has_one analytics_facet.
Independientemente de la lógica/negocio interno aquí, lo único que hace esta tarea es llamar a analytics_eligible? método 200 veces cada 2 minutos. En cuestión de 4 horas, mi uso de memoria física es de 110 MB y la memoria virtual es de 200 MB. ¡Solo por hacer algo así de simple! ¡Ni siquiera puedo empezar a imaginarme cuánta memoria comerá si está haciendo análisis reales en 10,000 Publicaciones con información real de producción! De acuerdo, puede que no se ejecute cada 2 minutos, más como cada 30, aún así no creo que vaya a volar.
Esto está ejecutando ruby 1.9.7, rails 2.3.5 en Ubuntu 10.x 64 bit. Mi computadora portátil tiene una memoria de 4GB y una CPU de doble núcleo.
¿Los rieles son realmente tan malos o estoy haciendo algo mal?
Delayed::Worker.logger.info('RAM USAGE Job Start: ' + `pmap #{Process.pid} | tail -1`[10,40].strip)
Post.not_expired.each do |p|
if p.analytics_eligible?
#this method is never called
Post.find_for_analytics_update(p.id).update_analytics
end
end
Delayed::Worker.logger.info('RAM USAGE Job End: ' + `pmap #{Process.pid} | tail -1`[10,40].strip)
Delayed::Job.enqueue PeriodicAnalyticsJob.new(), 0, 2.minutes.from_now
modelo de Post
def analytics_eligible?
vf = self.analytics_facet
if self.total_ratings > 0 && vf.nil?
return true
elsif !vf.nil? && vf.last_update_tv > 0
ratio = self.total_ratings/vf.last_update_tv
if (ratio - 1) >= Constants::FACET_UPDATE_ELIGIBILITY_DELTA
return true
end
end
return false
end
Lo único que agregaría a esta excelente respuesta es una nota que indica que cualquier proceso de Rails consumirá mucha memoria, sus 110mb no son poco comunes. Esto no es indicativo de una pérdida de memoria en su código o de cuánto procesamiento ha realizado. Si procesas 1000 registros o 10M, usarás la misma cantidad de memoria si has hecho las cosas correctamente (de la forma en que Chris lo explicó). – wuputah