2014-10-13 18 views
8

Sau khi triển khai ứng dụng Rails của chúng tôi (4.0.9, Ruby 2.1.2), chúng tôi nhận thấy yêu cầu ứng dụng của chúng tôi bị treo sau một thời gian, thường là 1 ngày.Yêu cầu bị kẹt trong ActiveRecord :: QueryCache middleware

Sử dụng đá quý rack_timer, chúng tôi có thể tìm ra các yêu cầu bị kẹt ở ActiveRecord :: QueryCache middleware.

Rack Timer (incoming) -- ActiveRecord::QueryCache: 925626.7731189728 ms 

Sau khi loại bỏ nó, ứng dụng của chúng tôi dường như trở lại bình thường. Tuy nhiên, tôi hiểu mục đích của phần mềm trung gian này là để tăng hiệu suất, do đó, loại bỏ chỉ là một giải pháp tạm thời. Chúng tôi đang sử dụng mysql (5.1.67) với bộ đổi nguồn mysql2 (0.3.13)

Cập nhật: Ngay sau khi tôi đăng câu hỏi này, máy chủ bắt đầu treo lại, yêu cầu lần này bị kẹt tại ActionDispatch :: Routing :: RouteSet

I, [2014-10-13T23:17:03.661346 #32498] INFO -- : Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 3667661.2360477448 ms 
I, [2014-10-13T23:17:03.661946 #32498] INFO -- : Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 4373914.719343185 ms 

Bạn có biết lý do nào có thể gây ra điều này không?

Cảm ơn bạn trước.

+0

Kiểm tra câu hỏi khác của bạn, tôi đã trả lời ở đó. – Bowersbros

+1

Bạn đã tìm được giải pháp chưa? Tôi đang gặp vấn đề tương tự với postgres trên heroku. –

+1

Mọi cập nhật về điều này? Theo nguồn cấp dữ liệu có "một câu hỏi khác" nhưng tôi không thể tìm thấy nó .. – jalagrange

Trả lời

1

Nguyên nhân có thể xảy ra nhất là kết nối của bạn với cơ sở dữ liệu đã chết (tường lửa, cấu hình máy chủ ...) và Rails không nhận thấy, vì vậy thời gian chờ xảy ra bên trong ActiveRecord::QueryCache. Khi Rails thông báo kết nối đã chết, nó sẽ kết nối lại và luồng thực thi tiếp tục.

Thử đặt thông số read_timeout trong tệp database.yml của bạn thành khoảng 10 giây và kiểm tra cài đặt kết nối và máy chủ của bạn.

+0

Nếu tôi không sai, khi 'QueryCache' được sử dụng, cơ sở dữ liệu không đạt được (đó là lý do tại sao nó là bộ đệm), vì vậy tôi nghĩ rằng nó phải liên quan đến việc thực hiện bộ nhớ cache đang được sử dụng (' mem_cache', v.v. ..) –

+0

Ngay cả khi không được sử dụng, kết nối được thiết lập nếu tôi nhớ chính xác và sự cố "treo" có thể xảy ra trong giai đoạn đó. – fjyaniez

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