TERMをトラップしてQUITを送信した後のHerokuでのユニコーン終了タイムアウト


90

ユニコーンとsidekiqを実行しているHerokuアプリのR12終了タイムアウトエラーを受け取ります。これらのエラーは、1日に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にWebリクエストを送信する必要がありますか?

FWIW、私はHerokuのゼロダウンタイムデプロイメントプラグイン(https://devcenter.heroku.com/articles/labs-preboot/)を使用しています。


6
それが役立つ場合、ゼロダウンタイムデプロイメントプラグインなしでこの問題も発生しています。私は誰かが助けてくれることを願っています、またはあなたがそれを理解したらあなたが答えを投稿できることを願っています。おそらくHerokuサポートに連絡しますか?
クリスピーターズ

Chrisと同じように、私はダウンタイムをゼロにしておらず、この問題が発生しています。これは、Herokuが推奨するユニコーン設定を使用しているにもかかわらずです。
imderek 2013

Herokuの推奨構成を使用しているにもかかわらず、同じ問題が発生しています。ダウンタイムなしの展開もありません。
elsurudo 2013

ここでも同じ問題があり、プリブートプラグインを使用していません。
エイドリアン・マクニール2013

私が気づいたことの1つは、これは通常、労働者のダイノで発生することです。常にではないが、通常。
Chris Peters

回答:


4

ここでタイムアウトを引き起こしているのはカスタム信号処理です。

編集:私はHerokuのドキュメントに同意しないことに反対票を集めています。これに対処したいと思います。

TERMシグナルをキャッチして飲み込むようにUnicornアプリケーションを構成することは、アプリケーションがハングして正しくシャットダウンしない最も可能性の高い原因です。

Herokuは、TERMシグナルをキャッチしてQUITシグナルに変換することが、ハードシャットダウンを正常なシャットダウンに変える正しい動作であると主張しているようです。

ただし、これを行うと、場合によってはシャットダウンしないというリスクが生じるようです-このバグの原因。Unicornを実行しているハングしているダイノを経験しているユーザーは、証拠を検討し、ドキュメントだけでなく、第一原理に基づいて独自の決定を行う必要があります。


2
Herokuのドキュメントにはまだ「SIGTERMによる正常なシャットダウン」が含まれており、Cedarスタックでこれを行う必要がなくなったという言及はありません。これが見つかる場所への参照はありますか?
Dennis

この回答を裏付けるドキュメントは見つかりません。UnicornとHerokuの両方のドキュメントによると、Unicornは依然としてPOSIX信号解釈の逆を使用しています。
Josh Kovach、2014年

本当じゃない。Unicornは、TERMシグナルを明示的に処理しない限り、正常にシャットダウンしません。これをサポートするデベロッパーセンターの記事は、devcenter.heroku.com
slant

Herokuのドキュメントでは、これらの信号をキャッチ/変換しようとするべきだと言っています。正常にシャットダウンしようとする試みは、シャットダウンタイムアウトの最も可能性の高い根本原因です。
Winfield
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.