หมดเวลาการออกจากยูนิคอร์นบน Heroku หลังจากวางกับดัก TERM และส่ง QUIT


90

ฉันได้รับข้อผิดพลาด R12 Exit Timeout สำหรับแอป Heroku ที่ใช้งานยูนิคอร์นและไซด์คิค ข้อผิดพลาดเหล่านี้เกิดขึ้น 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
imderek

ฉันมีปัญหาเดียวกันแม้ว่าจะใช้การกำหนดค่าที่แนะนำของ Heroku ไม่มีการปรับใช้ zero-downtime ด้วย
elsurudo

ปัญหาเดียวกันที่นี่และไม่ได้ใช้ปลั๊กอิน preboot
Adrian Macneil

สิ่งหนึ่งที่ฉันสังเกตเห็นก็คือสิ่งนี้เกิดขึ้นกับไดโนสของคนงานโดยปกติ ไม่เสมอไป แต่โดยปกติ
Chris Peters

คำตอบ:


4

ฉันคิดว่าการจัดการสัญญาณแบบกำหนดเองของคุณคือสิ่งที่ทำให้หมดเวลาที่นี่

แก้ไข: ฉันได้รับการโหวตลงคะแนนเนื่องจากไม่เห็นด้วยกับเอกสารของ Heroku และฉันต้องการแก้ไขปัญหานี้

การกำหนดค่าแอปพลิเคชัน Unicorn ของคุณให้จับและกลืนสัญญาณ TERM เป็นสาเหตุส่วนใหญ่ที่ทำให้แอปพลิเคชันของคุณหยุดทำงานและปิดไม่ถูกต้อง

ดูเหมือนว่า Heroku จะโต้แย้งว่าการจับและเปลี่ยนสัญญาณTERMเป็นสัญญาณQUITนั้นเป็นพฤติกรรมที่ถูกต้องในการเปลี่ยนการปิดเครื่องอย่างหนักเป็นการปิดเครื่องอย่างสง่างาม

อย่างไรก็ตามการทำเช่นนี้ดูเหมือนจะทำให้เกิดความเสี่ยงที่จะไม่มีการปิดระบบเลยในบางกรณี - ต้นตอของจุดบกพร่องนี้ ผู้ใช้ที่มีอาการห้อย dynos ที่รันยูนิคอร์นควรพิจารณาหลักฐานและตัดสินใจด้วยตนเองตามหลักการแรกไม่ใช่แค่เอกสาร


2
เอกสาร Heroku ยังคงครอบคลุมถึง "การปิดระบบอย่างนุ่มนวลด้วย SIGTERM " และฉันไม่เห็นการกล่าวถึงว่าไม่จำเป็นต้องทำสิ่งนี้ในกองไม้ซีดาร์อีกต่อไป คุณมีข้อมูลอ้างอิงว่าสามารถหาได้จากที่ใด
Dennis

ฉันไม่พบเอกสารใด ๆ ที่สนับสนุนคำตอบนี้ ตามเอกสารของ Unicorn และ Heroku Unicorn ยังคงใช้การตีความสัญญาณ POSIX แบบย้อนกลับ
Josh Kovach

นี่ไม่เป็นความจริง. ยูนิคอร์นยังคงไม่ปิดตัวลงอย่างสง่างามโดยไม่มีการจัดการสัญญาณ TERM อย่างชัดเจน บทความ Dev Center ที่สนับสนุนสิ่งนี้มีอยู่ที่นี่: devcenter.heroku.com/articles/rails-unicorn#config
slant

ฉันรู้จักเอกสาร Heroku บอกว่าคุณควรพยายามจับ / แปลงสัญญาณเหล่านี้ ความพยายามในการปิดระบบอย่างสง่างามเป็นสาเหตุหลักของการหมดเวลาปิดระบบ
Winfield
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.