2014-11-21 17 views
8

thoảng, mỗi khi tôi đẩy một phát hành để Heroku không lâu sau tôi sẽ nhận được lỗi sau (Tôi đang chạy dynos 2 512MB):Heroku - tại sao tôi gặp lỗi R12 (Thoát thời gian chờ) khi đẩy bản phát hành lên Heroku?

2014-11-21 00:38:30.216 
188 <45>1 2014-11-21T00:38:29.163459+00:00 heroku web.2 - - Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM 

Tôi đang sử dụng máy chủ ứng dụng kỳ lân, tiếc là chỉ có 1 cho mỗi kỳ lân công nhân mỗi 512MB dyno (kể từ lúc cao điểm của nó, ứng dụng RSS của tôi là 320MB - yea, đi con số, một số sưng lên đang xảy ra). Không chắc chắn nếu điều này giúp, nhưng tôi đang trên Cedar14 với Preboot kích hoạt. UNICORN_WORKERS được đặt thành 1.

Đây là thiết lập lân của tôi. Tôi có nên lo ngại về lỗi này không?

Và trong khi chúng tôi đang trong chủ đề này, kích thước nhóm db 15 quá lớn đối với 2 dynos của tôi (tôi đang sử dụng chuẩn Postgres cho phép tối đa 120 kết nối đồng thời).

worker_processes Integer(ENV['UNICORN_WORKERS'] || 2) 

timeout Integer(ENV['UNICORN_TIMEOUT'] || 25) 

preload_app true 

before_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 

    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.connection.disconnect! 
    end 
end 

after_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' 
    end 

    # other settings 
    if defined?(ActiveRecord::Base) 
    config = ActiveRecord::Base.configurations[Rails.env] || Rails.application.config.database_configuration[Rails.env] 
    config['reaping_frequency'] = Integer(ENV['DB_REAPING_FREQUENCY'] || 10) 
    config['pool'] = ENV['DB_POOL'] || 15 
    ActiveRecord::Base.establish_connection(config) 
    end 

end 
+0

Lưu ý phụ về cấu hình ở trên. Thực sự 'DB_POOL' phải là 1 hoặc 2 trong thế giới kỳ lân (kết nối cho mỗi quy trình công nhân). Do đó tốt hơn để có 'ENV [' DB_POOL '] || 2'. – user1322092

Trả lời

9

Heroku có một quy tắc khi triển khai mà về cơ bản nói điều này:

  • Khi Dyno của bạn sẽ khởi động lại, Heroku sẽ hỏi các quy trình của bạn độc đáo để đóng mình xuống. Điều này mang lại cho họ cơ hội làm những việc tốt đẹp như kết nối db mở, vv
  • Nếu quy trình của bạn không tự đóng trong vòng 10 giây, bạn sẽ gặp lỗi ở trên và Heroku sẽ giết chết quá trình của bạn để khởi động lại .

Điều này được thực hiện để đảm bảo bạn không có một hóa đơn khổng lồ chạy vì một trong các quy trình của bạn bằng cách nào đó không bao giờ thoát.

gì đang xảy ra trong trường hợp của bạn (tôi suy đoán đây), là bạn đã có rất nhiều các kết nối DB mở, và nó lấy hơn 10 giây để đóng chúng vì một trong hai:

  • Bạn có độ trễ DB.
  • DB của bạn bị gánh nặng với các nội dung khác.
  • Đơn đăng ký của bạn chỉ đơn giản là không thể đóng nhiều tài khoản đó trong < 10 giây.

Nhìn chung, đây không phải là vấn đề lớn. Vấn đề này tự sắp xếp theo thời gian, vì vậy tôi sẽ không lo lắng về nó.

+0

cảm ơn! Thật an ủi khi biết đó không phải là vấn đề lớn. Không ai hiện đang nhấn vào ứng dụng bên cạnh tôi, và tôi vấn đề chỉ xuất hiện sau khi 'git push heroku master' (Logentries gửi cho tôi một cảnh báo). Và về kích thước bể db, có vẻ như không tối ưu cho Heroku đề nghị 2 trong khi rõ ràng hơn có thể được tận dụng (xem "Do điều này, chúng tôi khuyên bạn nên thiết lập hồ bơi của ứng dụng của bạn hoặc 1 hoặc 2 để tránh các kết nối zombie từ saturating cơ sở dữ liệu của bạn. "trong https://devcenter.heroku.com/articles/concurrency-and-database-connections). Hoặc, nếu tôi đã bật tính năng gặt, tôi có thể bỏ qua? – user1322092

+0

Rùa phải đủ tốt. Có bất kỳ mã nào đang chạy trong ứng dụng của bạn có thể không thoát nhanh không? Đó thường là nơi tôi muốn kiểm tra các công cụ (như nếu tôi đang làm một vòng lặp cho một nơi nào đó lặp đi lặp lại trên một số lượng lớn các công cụ, vv). – rdegges

+0

Cảm ơn ... Tôi không có bất kỳ nhiệm vụ chạy dài nào, nhưng tôi tự hỏi liệu Preboot của Heroku có liên quan gì với nó không ... https://devcenter.heroku.com/articles/preboot. Tôi sẽ tiếp tục giữ và chú ý. Cảm ơn một lần nữa! – user1322092

Các vấn đề liên quan