2012-01-24 40 views
7

Mi rieles aplicación utiliza demasiada memoria:cómo aumentar la memoria en heroku?

Process running mem=701M(136.9%) 
Error R14 (Memory quota exceeded) 

Hasta que no resuelve el problema, ¿cómo puedo aumentar el tamaño de la memoria en heroku?

¿Agregará más web dynos ayudará a dividir la memoria?

Gracias

Respuesta

2

De los documentos, sí. Eso debería hacerlo ..

"Cada dinamómetro obtiene 512MB de memoria para funcionar dentro".

http://devcenter.heroku.com/articles/dynos

+2

¿Crees que agregar dynos web dará una solución temporal? –

5

No se puede. Dynos tiene una cuota de 512M.B, incluso si obtienes más dynos, todavía golpearás la misma pared. Arregla tus pérdidas de memoria.

Cada dinamómetro obtiene 512MB de memoria para operar dentro. La mayoría de las aplicaciones se adaptarán cómodamente a esta concesión, y como desarrollador, no necesita preocuparse por la memoria en absoluto.

En algunos casos, su dinamómetro puede alcanzar o superar esa cantidad de 512MB. Normalmente esto se debe a una pérdida de memoria en su aplicación, en , en cuyo caso puede utilizar una herramienta de generación de perfiles de memoria como Oink para Ruby o Heapy para Python para rastrear la fuga y repararla.

Dynos que excedan 512 MB de uso de memoria mostrará un error R14 en los registros, así:

4

usted tiene un límite duro de 512 MB de RAM para jugar sin excepciones. Esta memoria está en base a cada dinamómetro. Por lo tanto, no podrá implementar su aplicación en Heroku tal como está con su sustancial uso de RAM.

Raramente veo aplicaciones que superan los cientos de Mb de RAM, por lo que realmente necesita ver el origen del problema.

Con su uso de RAM, incluso en un VPS típico, tendría dificultades para ejecutar más de un par de procesos a la vez.

8

Tengo el mismo problema con uno de mis clientes. A veces, indagar en fugas de memoria puede ser una tarea difícil, especialmente cuando la fuente de la fuga podría estar en un código de un tercero.

Lo que hago es reiniciar varias dinas cada pocas horas. Recogí horas de poco tráfico para hacer los reinicios.

  1. crear un cron:

    namespace :utils do 
        desc "Restart app by process and time table" 
        task :restart => :environment do 
        time_hash = { 
         1 => %w[web.1 web.2 web.3], 
         3 => %w[web.4 web.5 web.6], 
         5 => %w[web.7 web.8 web.9], 
         7 => %w[web.10 web.11 web.12], 
         16 => %w[web.13 web.14 web.1], 
         18 => %w[web.2 web.3 web.4], 
         20 => %w[web.5 web.6 web.7], 
         22 => %w[web.8 web.9 web.10], 
         0 => %w[web.11 web.12 web.13 web.14], 
        } 
        processes = time_hash[Time.now.hour] 
        processes.each {|process| restart_process(process)} if processes 
        end 
    
        def restart_process(name) 
        puts "restarting process #{name}:" 
        heroku = Heroku::Client.new(ENV['APP_USERNAME'], ENV['APP_PASSWORD']) 
        heroku.ps_restart(ENV['APP_NAME'], :ps => name) 
        end 
    end 
    
  2. use el programador horario (heroku complemento) para ejecutar este cron.

+1

Enfoque realmente interesante – Jonathan

+2

Acabo de agregar esto a mi implementación: Aquí en la implementación más genérica que funciona con _n_ procesos web: https://gist.github.com/2955544 – Jonathan

+0

deberá ejecutar esto para APP_USERNAME, APP_PASSWORD, APP_NAME $ heroku config: add [email protected] –

0

Heroku actualizó su API, entonces los comentarios arriba no funcionan más. Hice un giro más simple apagado en los comentarios anteriores (en el archivo: # {} Rails.root /lib/tasks/schedualer.rake):

class HerokuMaintenance 
     def self.get_web_and_workers(get_ps_array) 
      output = [] 
      get_ps_array.each do |i| 
       type = fetch('process',nil) 
       if type.match(/^worker\.\d+$/) or type.match(/^web\.\d+$/) 
        output << type 
       end 
      end 
      return output 
     end 
     ######################################################################### 
     def self.restart_all 
      heroku_client.post_ps_restart(ENV['APP_NAME']) 
     end 
     ######################################################################### 
     def self.get_ps_array(heroku_client) 
      heroku_client.get_ps(ENV['APP_NAME']).body 
     end 
     ######################################################################### 

     def self.heroku_client 
      Heroku::API.new(:username => ENV['APP_USERNAME'] , :password => ENV['APP_PASSWORD']) 
     end 
     ######################################################################### 
desc "Restart app workers/web" 
task :my_restart => :environment do 
    HerokuMaintenance.restart_all 
end 

siguiendo las instrucciones de https://devcenter.heroku.com/articles/scheduler
1. complementos heroku: crean planificador: estándar
2. heroku carrera de rake my_restart
3. complementos heroku: planificador abierto (lo fijo para ejecutar cada hora debido a algunos problemas de memoria molestos no he resuelto todavía).

+0

Al principio pensé en hacer algo más complicado como los comentarios originales (de ahí el método get_web_and_workers) pero más adelante decidí simplemente reiniciar todo. Puede cambiar fácilmente el método get_web_and_workers para que se ajuste mejor a sus necesidades y a su uso. –

+0

Actualizaciones de la API Heroku: http://www.rubydoc.info/gems/heroku-api/0.4.2 –

Cuestiones relacionadas