2014-11-21 14 views
8

Di tanto in tanto, ogni volta che spingo un rilascio di Heroku poco dopo avrei ricevuto il seguente errore (sto correndo 2 512 lanci):Heroku - perché dovrei ricevere l'errore R12 (timeout di uscita) quando si preme un rilascio su Heroku?

2014-11-21 00:38:30.216 
188 <45>1 2014-11-21T00:38:29.163459+00:00 heroku web.2 - - Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM 

sto usando il server di applicazione unicorno, purtroppo solo l'1 per unicorno worker per 512MB di dyno (dato che al suo apice, il mio RSS di app è 320MB - sì, vai a capire, sta succedendo un po 'di fluttuante). Non sono sicuro se questo aiuta, ma sono su Cedar14 con Preboot abilitato. UNICORN_WORKERS è impostato su 1.

Ecco la configurazione del mio unicorno. Dovrei preoccuparmi di questo errore?

E mentre siamo su questo argomento, la dimensione del pool db 15 è troppo grande per i miei 2 dynos (sto usando lo standard Postgres che consente fino a 120 connessioni simultanee).

worker_processes Integer(ENV['UNICORN_WORKERS'] || 2) 

timeout Integer(ENV['UNICORN_TIMEOUT'] || 25) 

preload_app true 

before_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 

    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.connection.disconnect! 
    end 
end 

after_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' 
    end 

    # other settings 
    if defined?(ActiveRecord::Base) 
    config = ActiveRecord::Base.configurations[Rails.env] || Rails.application.config.database_configuration[Rails.env] 
    config['reaping_frequency'] = Integer(ENV['DB_REAPING_FREQUENCY'] || 10) 
    config['pool'] = ENV['DB_POOL'] || 15 
    ActiveRecord::Base.establish_connection(config) 
    end 

end 
+0

Una nota a margine sulla configurazione precedente. In realtà 'DB_POOL' dovrebbe essere 1 o 2 nel mondo unicorno (connessioni per processo di lavoro). Quindi meglio avere 'ENV ['DB_POOL'] || 2'. – user1322092

risposta

9

Heroku ha una regola durante la distribuzione che, in fondo dice questo:

  • Quando il banco sta per ricominciare, Heroku chiederà i processi ben a chiudersi verso il basso. Questo dà loro la possibilità di fare cose carine come connessioni db aperte, ecc.
  • Se il tuo processo non si chiude entro 10 secondi, otterrai l'errore sopra, e Heroku interromperà forzatamente il tuo processo per riavviarlo .

Questo è fatto per garantire che non si abbia un conto enorme in esecuzione perché uno dei processi in qualche modo non è mai uscito.

Quello che sta succedendo nel tuo caso (sto speculando qui), è che hai un sacco di connessioni DB aperte, e sta prendendo più di 10 secondi per chiuderle perché o:

  • È avere una certa latenza di DB.
  • Il tuo DB è gravato da altre cose.
  • L'applicazione non è in grado di chiuderne altrettante in < 10 secondi.

Nel complesso, non è un grosso problema. Questo problema si risolve nel tempo, quindi non me ne preoccuperei.

+0

grazie! È confortante sapere che non è un grosso problema. Nessuno sta attualmente colpendo l'app oltre a me, e il problema si verifica solo dopo "git push heroku master" (Logentries mi invia un avviso). E per quanto riguarda le dimensioni del pool db, sembra che Heroku non sia ottimale raccomandare 2 mentre chiaramente si può fare leva su più (vedi "A causa di questo raccomandiamo di impostare il pool dell'applicazione su 1 o 2 per evitare che le connessioni zombi saturino il database. "in https://devcenter.heroku.com/articles/concurrency-and-database-connections). Oppure, se ho mietuto abilmente, posso ignorare? – user1322092

+0

La raccolta dovrebbe essere sufficiente. Nella tua app c'è un codice di lunga durata che potrebbe non uscire rapidamente? Di solito è lì che controllerò qualcosa (come se stessi facendo un ciclo for da qualche parte per iterare su grandi quantità di cose, ecc.). – rdegges

+0

Grazie ... Non ho attività a lungo termine, ma mi chiedo se il Preboot di Heroku abbia qualcosa a che fare con esso ... https://devcenter.heroku.com/articles/preboot. Continuerò a tenere d'occhio. Grazie ancora! – user1322092