2011-12-14 6 views
7

Tôi chưa có nhiều may mắn khi tìm kiếm thông tin qua google, có thể ai đó ở đây đã gặp sự cố tương tự.Truy vấn postgres chậm trên Heroku không bị gián đoạn bởi giá hết thời gian chờ

Chúng tôi có ứng dụng đường ray chạy trên Heroku với DB Postgres. Chúng tôi có một truy vấn đặc biệt chậm (có, chúng tôi đang cố gắng giải quyết truy vấn), nhưng trong quá trình gỡ lỗi vấn đề này, tôi quan sát thấy rằng đá quý giá trị thời gian chờ của chúng tôi không giết yêu cầu trong 15 giây. Tôi đã thực hiện một kiểm tra bên cạnh bằng cách chèn một giấc ngủ (50) và chắc chắn đủ, rack-timeout đang làm việc một cách chính xác trong trường hợp đó.

Đây là bản sao đã được chỉnh sửa của nhật ký của chúng tôi cho thấy rằng thời gian rack (thời gian hết) đang diễn ra vài phút sau và chúng tôi vẫn thấy H12 Yêu cầu hết thời gian chờ sau 30 giây.

2011-12-14T21:15:16+00:00 app[web.2]: Started GET "/search?utf8=%E2%9C%93&terms=foo" for 173.164.186.205 at Wed Dec 14 13:15:16 -0800 2011 
    2011-12-14T21:15:16+00:00 app[web.2]: search query elapsed time => [0.000365018844604492] 
    2011-12-14T21:15:46+00:00 heroku[router]: Error H12 (Request timeout) -> GET /search dyno=web.2 queue= wait= service=30000ms status=503 bytes=0 
    2011-12-14T21:18:47+00:00 app[postgres]: [6-1] [removed] [COBALT] LOG: duration: 211241.725 ms statement: SELECT [truncated] 
    2011-12-14T21:18:47+00:00 app[web.2]: 
    2011-12-14T21:18:47+00:00 app[web.2]: ActionView::Template::Error (Timeout::Error: time's up!: SELECT [truncated]): 

Bất kỳ thông tin chi tiết nào về lý do và cách thực thi thời gian chờ?

Trả lời

4

Vâng, những gì đang xảy ra ở đây là những gì tôi gọi là một dyno zombie. Thời gian chờ 30 giây là làm mờ trong lưới định tuyến nằm phía trên Dyno của bạn. Về lý thuyết, dyno của bạn có thể chạy hàng giờ nhưng người dùng sẽ thấy lỗi sau 30 giây trực tiếp từ lưới định tuyến.

So. những gì xảy ra là thế này:

  1. Yêu cầu của bạn được thực hiện tại 21:15:16
  2. Tại 21:15:46 lưới tuyến trả nó lỗi, nhưng Dyno của bạn vẫn chế biến
  3. Tại 21:18:47 hoàn thiện theo yêu cầu của bạn.

Đối với những gì đang diễn ra với Rack :: Timeout và truy vấn chạy dài của bạn, nó có thể rơi vào đá quý pg mà bạn sử dụng dưới dạng Rack :: Timeout phụ thuộc vào chuỗi hoạt động chính xác. Điều này giải thích lý do tại sao bạn nhận được thời gian chờ thời điểm cơ sở dữ liệu trả về.

Thông tin thêm về dynos zombie: http://neilmiddleton.com/avoiding-zombie-dynos-with-heroku/

+0

Cảm ơn bạn đã phản hồi. Những gì tôi đang tìm kiếm là cái nhìn sâu sắc về cách tôi có thể buộc thời gian chờ để cắt bỏ yêu cầu. Chúng tôi đang sử dụng heroku và chúng tôi không chỉ định pg_gem, heroku có. Chúng tôi đang sử dụng cơ sở dữ liệu không được chia sẻ ở phiên bản 9.0.6. – sorens

+0

Thật không may Rack Timeout không thể giết một truy vấn đang chạy. Ứng dụng của bạn sẽ sử dụng đá quý pg trên Heroku vì nó được tiêm bởi quá trình biên dịch sên. –

1

Cho đến postgres 9.2 đi ra (trong đó có một hệ thống thời gian chờ tốt hơn), có không phải là một giải pháp dễ dàng với đá quý rack-timeout - postgres chỉ kiểm tra cho sự gián đoạn kết nối giữa báo cáo và do đó, thời gian chờ rack là hơi giới hạn trong lĩnh vực này. Bàn tay của nó được gắn ... Nếu bạn có quyền truy cập superuser để postgres bạn có thể thử một số chỉnh sửa cấu hình, nhưng kể từ khi bạn đang ở trên heroku, đó không phải là một lựa chọn.

Cố gắng tối ưu hóa các cuộc gọi cơ sở dữ liệu của bạn (đảm bảo tất cả các chỉ mục của bạn ở đó, v.v.) hoặc chia nhỏ các câu lệnh thành các phần nhỏ hơn cho vấn đề cụ thể này (điều này có vẻ phản trực giác).