TERM'i yakalayıp QUIT'i gönderdikten sonra Heroku'da Unicorn çıkış zaman aşımı


90

Unicorn ve sidekiq çalıştıran bir Heroku uygulaması için R12 Çıkış Zaman Aşımı hataları alıyorum. Bu hatalar günde 1-2 kez ve ne zaman konuşlandırsam ortaya çıkıyor. Tek boynuzlu atın doğru yanıt vermesi için Heroku'dan kapatma sinyallerini dönüştürmem gerektiğini anlıyorum, ancak aşağıdaki tek boynuzlu at yapılandırmasında bunu yaptığımı düşündüm:

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

Hatayı çevreleyen günlüklerim şöyle görünür:

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

Zaman aşımından önce tüm alt süreçlerin başarıyla toplandığı görülüyor. Ustanın hala hayatta olması mümkün mü? Ayrıca, yönlendirici, günlüklerde gösterildiği gibi, kapatma sırasında da dinamik sunucuya web istekleri gönderiyor mu?

FWIW, Heroku'nun sıfır kesinti süresi dağıtım eklentisini kullanıyorum ( https://devcenter.heroku.com/articles/labs-preboot/ ).


6
Yardımcı olursa , sıfır kesinti dağıtım eklentisi olmadan da bu sorunu yaşıyorum . Umarım birisi yardım edebilir ya da anlarsanız bir cevap gönderebilirsiniz. Belki Heroku desteğiyle iletişime geçebilirsiniz?
Chris Peters

Tıpkı Chris gibi, sıfır kesinti kullanmıyorum ve bu sorunu yaşıyorum. Bu, Heroku'nun önerilen tek boynuzlu at yapılandırmasını kullanmasına rağmen.
imderek

Heroku'nun önerilen yapılandırmasını kullanmama rağmen aynı sorunu yaşıyorum. Sıfır kesinti süresi de yok.
elsurudo

Burada da aynı sorun var ve preboot eklentisi kullanılmıyor.
Adrian Macneil

Fark ettiğim bir şey, bunun genellikle işçi dinozorlarında meydana gelmesidir. Her zaman değil, ama genellikle.
Chris Peters

Yanıtlar:


4

Sanırım burada zaman aşımına neden olan şey, özel sinyal işlemeniz.

DÜZENLEME: Heroku'nun belgelerine katılmadığım için olumsuz oy alıyorum ve bu konuyu ele almak istiyorum.

Unicorn uygulamanızı TERM sinyalini yakalayacak ve yutacak şekilde yapılandırmak, uygulamanızın askıda kalmasının ve doğru şekilde kapatılmamasının en olası nedenidir.

Heroku, bir TERM sinyalini yakalamanın ve bir QUIT sinyaline dönüştürmenin, sert bir kapatmayı zarif bir kapatmaya dönüştürmek için doğru davranış olduğunu iddia ediyor gibi görünüyor .

Ancak, bunu yapmak bazı durumlarda hiç kapanmama riskini ortaya çıkarıyor gibi görünüyor - bu hatanın kökü. Unicorn çalıştıran asılı dinozorları deneyimleyen kullanıcılar, kanıtları dikkate almalı ve sadece belgelere değil, ilk ilkelere göre kendi kararlarını vermelidir.


2
Heroku dokümantasyonu hala " SIGTERM ile Sorunsuz kapatma " konusunu ele alıyor ve artık Cedar yığınında bunu yapmaya gerek olmadığına dair bir söz görmüyorum. Bunun nerede bulunabileceğine dair bir referansınız var mı?
Dennis

Bu yanıtı destekleyen herhangi bir belge bulamıyorum. Hem Unicorn hem de Heroku'nun belgelerine göre, Unicorn hala POSIX sinyal yorumlamasının tersini kullanıyor.
Josh Kovach

Bu doğru değil. Unicorn, TERM sinyalini açık bir şekilde ele almadan hala nazikçe kapanmaz. Bunu destekleyen Dev Center makalesi şu adreste bulunabilir: devcenter.heroku.com/articles/rails-unicorn#config
slant

Heroku belgelerinin bu sinyalleri yakalamaya / dönüştürmeye çalışmanız gerektiğini söylediğini biliyorum. Düzgün bir şekilde kapatma girişimleri, kapatma zaman aşımlarının en olası temel nedenidir.
Winfield
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.