2013-07-03 10 views
91

Ricevo errori Timeout di uscita R12 per un'app di Heroku con unicorno e sidekiq. Questi errori si verificano 1-2 volte al giorno e ogni volta che utilizzo. Capisco che ho bisogno di convertire i segnali di disinserzione da Heroku per unicorno di rispondere correttamente, ma ho pensato che avevo fatto in seguito config unicorno:Timeout di uscita Unicorn su Heroku dopo aver bloccato TERM e invio QUIT

worker_processes 3 
timeout 30 
preload_app true 

before_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts "Unicorn master intercepting TERM and sending myself QUIT instead. My PID is #{Process.pid}" 
    Process.kill 'QUIT', Process.pid 
    end 

    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.connection.disconnect! 
    Rails.logger.info('Disconnected from ActiveRecord') 
    end 
end 

after_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts "Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT. My PID is #{Process.pid}" 
    end 

    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.establish_connection 
    Rails.logger.info('Connected to ActiveRecord') 
    end 

    Sidekiq.configure_client do |config| 
    config.redis = { :size => 1 } 
    end 
end 

miei ceppi che circondano l'aspetto errore come questo:

Stopping all processes with SIGTERM 
Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT. My PID is 7 
Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT. My PID is 11 
Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT. My PID is 15 
Unicorn master intercepting TERM and sending myself QUIT instead. My PID is 2 
Started GET "/manage" 
reaped #<Process::Status: pid 11 exit 0> worker=1 
reaped #<Process::Status: pid 7 exit 0> worker=0 
reaped #<Process::Status: pid 15 exit 0> worker=2 
master complete 
Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM 
Stopping remaining processes with SIGKILL 
Process exited with status 137 

Sembra che tutti i processi figlio siano stati estratti con successo prima del timeout. È possibile che il maestro sia ancora vivo? Inoltre, se il router continua a inviare richieste Web al banco durante lo spegnimento, come mostrato nei registri?

FWIW, sto usando il plug-in di downtime zero di Heroku (https://devcenter.heroku.com/articles/labs-preboot/).

+6

Se aiuta, sto anche riscontrando questo problema _ senza il plug-in di zero downtime. Spero che qualcuno possa aiutarti o puoi pubblicare una risposta se la capisci. Forse contattare il supporto di Heroku? –

+0

Proprio come Chris, non sto usando zero tempi di inattività e sto riscontrando questo problema. Questo nonostante l'uso della configurazione unicorno raccomandata da Heroku. – imderek

+0

Ho lo stesso problema, nonostante utilizzo la configurazione raccomandata da Heroku. Nessuna distribuzione zero downtime. – elsurudo

risposta

4

Penso che la gestione personalizzata del segnale sia ciò che sta causando i timeout qui.

EDIT: Ho ricevuto un downvoted per non essere d'accordo con la documentazione di Heroku e vorrei parlarne.

Configurare l'applicazione Unicorn per catturare e ingoiare il segnale TERM è la causa più probabile dell'appendere e non arrestare correttamente l'applicazione.

Heroku sembra sostenere che cattura e trasformare un segnaletermine in una QUIT segnale è il comportamento giusto per trasformare un arresto duro in un arresto.

Tuttavia, fare questo sembra introdurre il rischio di non arrestare affatto in alcuni casi - la radice di questo bug. Gli utenti che sperimentano dinamiche sospese con Unicorn dovrebbero prendere in considerazione le prove e prendere le proprie decisioni in base ai primi principi, non solo alla documentazione.

+2

La documentazione di Heroku copre ancora "[Arresto grazioso con SIGTERM] (https://devcenter.heroku.com/articles/dynos#graceful-shutdown-with -sigterm) ", e non vedo la menzione di non aver più bisogno di farlo sullo stack Cedar. Hai un riferimento a dove questo può essere trovato? – Dennis

+0

Non riesco a trovare alcuna documentazione che supporti questa risposta. Secondo la documentazione di Unicorn e Heroku, Unicorn usa ancora il retro dell'interpretazione del segnale POSIX. –

+0

Questo non è vero. Unicorn continua a non chiudersi con grazia senza la gestione esplicita del segnale TERM. L'articolo del Dev Center che supporta questo può essere trovato qui: https://devcenter.heroku.com/articles/rails-unicorn#config – slant

Problemi correlati