2013-07-03 11 views
91

Otrzymuję R12 Exit Timeout błędy dla aplikacji Heroku z jednorożcem i sidekiq. Te błędy występują 1-2 razy dziennie i kiedy tylko się rozmieszczę. Rozumiem, że muszę konwertować sygnały z zamykaniem z Heroku na jednorożca, aby poprawnie odpowiedzieć, ale myślałem, że zrobiłem tak w poniżej jednorożca config:Limit czasu wyjścia Unicorn na Heroku po zatrzymaniu TERM i wysłaniu 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 

Moje dzienniki otaczających wygląd błędzie takiego:

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 

Wygląda na to, że wszystkie procesy podrzędne zostały pomyślnie zebrane przed upływem limitu czasu. Czy to możliwe, że mistrz wciąż żyje? Ponadto, czy router nadal wysyła żądania sieciowe do dyno podczas zamykania, jak pokazano w dziennikach?

FWIW, Używam wtyczki zerowego wyłączenia Heroku (https://devcenter.heroku.com/articles/labs-preboot/).

+6

Jeśli to pomaga, to również mam ten problem _ bez użycia wtyczki "zero czasów". Mam nadzieję, że ktoś może ci pomóc, lub możesz napisać odpowiedź, jeśli to zrozumiesz. Być może skontaktuj się z pomocą Heroku? –

+0

Podobnie jak Chris, nie używam zerowego czasu przestoju i doświadczam tego problemu. Jest to pomimo użycia poleconego przez Heroku konfiguratora jednorożca. – imderek

+0

Mam ten sam problem, pomimo używania zalecanej przez Heroku konfiguracji. Bez żadnych przestojów. – elsurudo

Odpowiedz

4

Wydaje mi się, że niestandardowe przetwarzanie sygnału jest przyczyną przekroczenia limitu czasu.

EDYCJA: Cofnę się za odrzucenie dokumentacji Heroku i chciałbym to zająć.

Konfiguracja aplikacji jednorożca do przechwytywania i przełykania sygnału TERM jest najbardziej prawdopodobną przyczyną zawieszenia aplikacji i niezamierzonego wyłączenia.

Heroku zdaje się twierdzić, że wzrok i przekształcania TERM sygnał do QUIT sygnał jest prawo zachowania obrócić dysk zamknięcie do płynnego zamykania.

Jednak wydaje się, że w niektórych przypadkach istnieje ryzyko braku wyłączenia - źródło tego błędu. Użytkownicy doświadczający zawieszania dynama z systemem Unicorn powinni rozważyć dowody i podjąć własną decyzję w oparciu o pierwsze zasady, a nie tylko dokumentację.

+2

Dokumentacja Heroku nadal obejmuje "[Wdzięczne wyłączenie za pomocą SIGTERM] (https://devcenter.heroku.com/articles/dynos#graceful-shutdown-with -sigterm) "i nie widzę wzmianki o tym, że nie muszę tego robić na stosie cedrowym. Czy masz odniesienie do tego, gdzie można to znaleźć? – Dennis

+0

Nie mogę znaleźć żadnej dokumentacji, która obsługuje tę odpowiedź. Zgodnie z dokumentacją Unicorn i Heroku, Unicorn nadal wykorzystuje odwrotność interpretacji sygnału POSIX. –

+0

To nie jest prawda. Unicorn wciąż nie zamyka się z wdziękiem bez wyraźnego posługiwania się sygnałem TERM. Artykuł Dev Center wspierający to można znaleźć tutaj: https://devcenter.heroku.com/articles/rails-unicorn#config – slant