Тайм-аут виходу Unicorn на Heroku після перехоплення TERM та надсилання QUIT


90

Я отримую помилки R12 Exit Timeout для програми Heroku, що працює на Unicorn та Sidekiq. Ці помилки трапляються 1-2 рази на день і всякий раз, коли я розгортаю. Я розумію, що мені потрібно перетворити сигнали вимкнення з Heroku, щоб єдиноріг правильно реагував, але думав, що я зробив це в наведеному нижче конфігурі єдинорога:

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

Мої журнали, що оточують помилку, виглядають так:

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

Схоже, що всі дочірні процеси були успішно зібрані до часу очікування. Чи можливо, господар ще живий? Крім того, чи повинен маршрутизатор все ще надсилати веб-запити dyno під час вимкнення, як показано в журналах?

FWIW, я використовую плагін розгортання Heroku з нульовим простоєм ( https://devcenter.heroku.com/articles/labs-preboot/ ).


6
Якщо це допомагає, я також маю цю проблему без нульового плагіна розгортання простою. Сподіваюся, хтось може допомогти, або ви можете опублікувати відповідь, якщо зрозумієте. Можливо, зв’яжіться зі службою підтримки Heroku?
Chris Peters

Так само, як і Кріс, я не використовую нульові простої і маю цю проблему. Це попри використання рекомендованої конфігурації єдинорога Heroku.
імдерек

У мене така сама проблема, незважаючи на використання рекомендованої конфігурації Heroku. Також немає розгортання з нульовим простоєм.
elsurudo

Тут та сама проблема, і не використання плагіна preboot.
Адріан Макнейл

Одне, що я помітив, це те, що ЗВИЧАЙНО трапляється на робочих динозах. Не завжди, але зазвичай.
Chris Peters

Відповіді:


4

Я думаю, що саме ваша причина обробки сигналів є причиною таймаутів.

РЕДАГУВАТИ: Я отримую голосування за незгоду з документацією Heroku, і я хотів би розглянути це питання.

Налаштування програми Unicorn для лову та проковтування сигналу TERM є найбільш вірогідною причиною зависання програми та її неправильного вимкнення.

Героку, схоже, стверджує, що вловлювання та перетворення сигналу TERM у сигнал QUIT - це правильна поведінка для перетворення жорсткого відключення в витончене відключення.

Однак, здається, це робить ризик взагалі не припиняти роботу в деяких випадках - корінь цієї помилки. Користувачам, які стикаються з висячими динозавами під управлінням Unicorn, слід враховувати докази та приймати власні рішення, спираючись на перші принципи, а не лише на документацію.


2
Документація Heroku все ще охоплює " Витончене вимкнення за допомогою SIGTERM ", і я не бачу згадки про те, що більше не потрібно це робити в стеці Cedar. У вас є посилання на те, де це можна знайти?
Денніс

Я не можу знайти жодної документації, яка підтверджує цю відповідь. Згідно з документацією Unicorn та Heroku, Unicorn все ще використовує зворотну інтерпретацію сигналу POSIX.
Джош Ковач,

Це не правда. Unicorn все ще не вимикається елегантно без явної обробки сигналу TERM. Статтю Dev Center, що підтримує це, можна знайти тут: devcenter.heroku.com/articles/rails-unicorn#config
скоса

Я розумію, що документи Heroku говорять, що вам слід спробувати вловити / перетворити ці сигнали. Спроби вимкнути витончено є найбільш вірогідною причиною таймаутів вимкнення.
Winfield
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.