Hết thời gian chờ thoát Unicorn trên Heroku sau khi bẫy TERM và gửi QUIT


90

Tôi nhận được lỗi R12 Exit Timeout cho một ứng dụng Heroku chạy unicorn và sidekiq. Những lỗi này xảy ra 1-2 lần một ngày và bất cứ khi nào tôi triển khai. Tôi hiểu rằng tôi cần chuyển đổi tín hiệu tắt máy từ Heroku để kỳ lân phản hồi chính xác, nhưng tôi nghĩ rằng tôi đã làm như vậy trong cấu hình kỳ lân bên dưới:

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

Nhật ký của tôi xung quanh lỗi trông như thế này:

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

Có vẻ như tất cả các quy trình con đã được gặt hái thành công trước thời gian chờ. Có thể là chủ nhân vẫn còn sống? Ngoài ra, bộ định tuyến có nên gửi yêu cầu web đến dyno trong khi tắt, như được hiển thị trong nhật ký không?

FWIW, tôi đang sử dụng plugin triển khai thời gian chết bằng không của Heroku ( https://devcenter.heroku.com/articles/labs-preboot/ ).


6
Nếu nó hữu ích, tôi cũng đang gặp sự cố này mà không có plugin triển khai thời gian chết bằng không. Tôi hy vọng ai đó có thể giúp đỡ hoặc bạn có thể đăng câu trả lời nếu bạn tìm ra nó. Có lẽ liên hệ với bộ phận hỗ trợ của Heroku?
Chris Peters

Cũng giống như Chris, tôi không sử dụng thời gian chết bằng 0 và đang gặp sự cố này. Điều này bất chấp việc sử dụng cấu hình kỳ lân được đề xuất của Heroku.
imderek

Tôi đang gặp vấn đề tương tự, mặc dù sử dụng cấu hình được đề xuất của Heroku. Không có thời gian chết triển khai không.
elsurudo

Vấn đề tương tự ở đây và không sử dụng plugin khởi động trước.
Adrian Macneil

Một điều tôi nhận thấy là điều này THẬT SỰ THẬT xảy ra trên thợ nhuộm. Không phải luôn luôn, nhưng thường là.
Chris Peters

Câu trả lời:


4

Tôi nghĩ rằng việc xử lý tín hiệu tùy chỉnh của bạn là nguyên nhân gây ra thời gian chờ ở đây.

CHỈNH SỬA: Tôi bị phản đối vì không đồng ý với tài liệu của Heroku và tôi muốn giải quyết vấn đề này.

Định cấu hình ứng dụng Unicorn của bạn để bắt và nuốt tín hiệu TERM là nguyên nhân rất có thể khiến ứng dụng của bạn bị treo và không tắt đúng cách.

Heroku dường như lập luận rằng việc bắt và chuyển đổi tín hiệu TERM thành tín hiệu QUIT là hành vi đúng đắn để biến một lần tắt cứng thành một lần tắt máy có duyên.

Tuy nhiên, làm điều này dường như dẫn đến nguy cơ không thể tắt máy trong một số trường hợp - căn nguyên của lỗi này. Người dùng gặp phải lỗi treo máy chạy Unicorn nên xem xét bằng chứng và đưa ra quyết định của riêng họ dựa trên các nguyên tắc đầu tiên, không chỉ tài liệu.


2
Tài liệu của Heroku vẫn bao gồm " Tắt máy có duyên với SIGTERM " và tôi không thấy đề cập đến việc không cần thực hiện việc này nữa trên ngăn xếp Cedar. Bạn có tham khảo về nơi này có thể được tìm thấy?
Dennis

Tôi không thể tìm thấy bất kỳ tài liệu nào hỗ trợ câu trả lời này. Theo cả tài liệu của Unicorn và Heroku, Unicorn vẫn sử dụng mặt trái của cách giải thích tín hiệu POSIX.
Josh Kovach

Đây không phải là sự thật. Unicorn vẫn không tắt một cách duyên dáng nếu không xử lý rõ ràng tín hiệu TERM. Các bài viết Dev Center hỗ trợ này có thể được tìm thấy ở đây: devcenter.heroku.com/articles/rails-unicorn#config
nghiêng

Tôi nhận ra các tài liệu về Heroku nói rằng bạn nên cố gắng bắt / chuyển đổi những tín hiệu này. Việc cố gắng tắt máy một cách duyên dáng là nguyên nhân gốc rễ rất có thể khiến máy hết thời gian tắt máy.
Winfield
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.