2013-09-06 45 views
13

Tôi có trang web là nhãn màu trắng (Nhiều phiên bản của cùng một trang web) mà tôi đã khởi chạy gần đây. Chưa có lưu lượng truy cập lớn - chủ yếu là bot nhưng có thể 800 người dùng mỗi ngày. Nó được lưu trữ trên Azure với một cơ sở dữ liệu Azure, thêm vào một bảng quản trị nằm trên một máy chủ không phải là Azure. Cả hai trang web kết nối với cùng một cơ sở dữ liệu Azure. Ngoài ra còn có một số vai trò công nhân đang chạy để xử lý dữ liệu - 99% thời gian họ không làm bất kỳ điều gì, nhưng họ thường xuyên kiểm tra.Sự cố kết nối cơ sở dữ liệu SQL Azure - Quá nhiều kết nối?

Tôi đã luôn gặp phải những sai sót ngẫu nhiên mà kéo dài một vài giây và sau đó nó là ok một lần nữa, chẳng hạn như:

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

Sáng nay, tuy nhiên, chúng tôi đã có một vấn đề nghiêm trọng hơn. Nó bắt đầu với:

System.ComponentModel.Win32Exception: An existing connection was forcibly closed by the remote host

Điều này xảy ra trong khi chương trình (Google, Baidu, AhrefsBot & Wiseguys.nl) được lập chỉ mục trang web. Tôi có một hoặc nhiều lỗi từ những lỗi này. Sau đó, tôi nhận được:

System.Data.SqlClient.SqlException: The service has encountered an error processing your request. Please try again. Error code 40143. A severe error occurred on the current command. The results, if any, should be discarded.

Đây là trong giai đoạn ExecuteReader.

10 phút sau đó, sự cố thực sự xảy ra - điều đó có nghĩa là không ai có thể đăng nhập vào giao diện quản trị, nhưng trang web lưu trữ Azure xuất hiện ok khi tôi kiểm tra mặc dù rô bốt vẫn đưa ra lỗi. Vấn đề là:

System.ComponentModel.Win32Exception: The wait operation timed out

Điều này tiếp tục với các kết nối ngẫu nhiên trong và ngoài khoảng một giờ. Sau đó, tôi gặp phải sự cố khác:

System.Data.SqlClient.SqlException: Resource ID : 1. The request limit for the database is 180 and has been reached. See ' http://go.microsoft.com/fwlink/?LinkId=267637 ' for assistance.

Điều này xảy ra trong và ngoài giờ trước - chủ yếu là cho vai trò của nhân viên. Sau đó tôi đã cố gắng tìm hiểu những gì đã chiếm tất cả các yêu cầu này và tôi đã tìm thấy lệnh này:

SELECT * FROM sys.dm_exec_requests

Nó chỉ trả lại 1 hoặc 2 yêu cầu khi tôi chạy nó liên tục.

Vì vậy, câu hỏi của tôi là: 1) Có ai khác trải nghiệm tương đối thường xuyên (một lần, có thể hai lần một ngày) tạm thời ngắt kết nối khỏi máy chủ được lưu trữ trên Azure không? 2) Danh sách các sự kiện ở trên có cho biết một vấn đề cụ thể không? Điều này có thể xảy ra khi nhiều quản trị viên đăng nhập cùng một lúc. 3) Làm cách nào để tôi có thể gỡ lỗi tốt hơn số lượng yêu cầu vào cơ sở dữ liệu khi tôi nhận được thông báo giới hạn 180?

Xin cảm ơn trước.

Trả lời

6

Tôi đã viết câu hỏi này một vài năm trước và được thông báo về một thay đổi nhỏ đối với tiêu đề. Có kinh nghiệm nhiều hơn về Cơ sở dữ liệu SQL Azure, bây giờ tôi biết câu trả lời cho vấn đề này. Vì lợi ích của người khác, đơn giản là cơ sở dữ liệu của bạn được đặt thành một cấp quá thấp.

Azure có các mức giá có chênh lệch khá lớn về hiệu suất. Để đạt được điều đó, họ điều chỉnh rất nhiều chỉ số hiệu suất, ví dụ: Sức mạnh CPU, yêu cầu mỗi phút, v.v.

Điều này có nghĩa là nếu bạn đang đẩy cấp của mình lên, yêu cầu của bạn sẽ bắt đầu được xếp hàng khi nguồn CPU/khối lượng yêu cầu quá cao để xử lý. Điều này dẫn đến thời gian chờ và sau đó giới hạn yêu cầu tăng lên khi các yêu cầu chờ xử lý. Cuối cùng, nó được đến điểm mà cơ sở dữ liệu về cơ bản đi xuống.

Kinh nghiệm của tôi là các cấp cơ sở dữ liệu thấp hơn, chẳng hạn như S0 và S1, thực sự không được hỗ trợ và không được sử dụng cho bất kỳ điều gì khác ngoài các trang web phát triển hoặc rất cơ bản.

Có một số công cụ tuyệt vời trong cổng Azure cho phép bạn gỡ lỗi những gì đang xảy ra với cơ sở dữ liệu của bạn, chẳng hạn như biểu đồ CPU, chỉ mục cố vấn và thông tin chi tiết về hiệu suất truy vấn.

0

Có vẻ như bạn đang đi đúng hướng trong việc xem DMM dm_exec_requests này. Tôi nghi ngờ bạn đã thấy điều này, nhưng có một chút thông tin công bằng hơn về giới hạn 180 ga là documented here và vạch ra một số lý do chính cho nó.

Nếu bạn quan tâm đến chúng tôi, chúng tôi có dịch vụ được gọi là Cotega, điều này có thể hữu ích cho cả hai câu hỏi của bạn. Đầu tiên là chúng tôi có thể chạy tất cả các phím DMV's against your database để cho bạn thấy những gì đang xảy ra để giúp bạn phân tích db của bạn và chúng tôi cũng có thể thông báo cho bạn (email, sms) khi bạn bắt đầu đến gần throttling limits.

0

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

System.ComponentModel.Win32Exception: An existing connection was forcibly closed by the remote host

cả hai có thể bị bỏ qua một cách an toàn. Chúng xảy ra bất cứ khi nào kết nối bị gián đoạn bên ngoài, điều này có thể xảy ra nếu người dùng đóng trình duyệt ở giữa nhận phản hồi hoặc nếu các sự cố mạng khác phá vỡ kết nối. Có những ngoại lệ tương tự khác có thể do mã khuôn khổ khác nhau đang hoạt động khi điều kiện đó được phát hiện. Những ngoại lệ này được ném để ngừng xử lý yêu cầu vì người gọi không còn nghe nữa.

Nếu bạn muốn theo dõi số lượng yêu cầu đang hoạt động, bạn nên tạo trình bao bọc mà bạn sử dụng cho tất cả các kết nối SQL, thực hiện tăng và giảm liên tục trong khi kết nối đang được sử dụng (sử dụng IDisposable) và theo dõi high-water-mark cho giá trị đó. Bạn có thể báo cáo nó trong trang ẩn hoặc quản trị đặc biệt. Bằng cách này, ngay cả khi bạn không thể xâm nhập vào hệ thống khi sự cố xảy ra, bạn có thể thấy số lượng kết nối hoạt động cao nhất là gì để chắc chắn đó không phải là vấn đề của bạn. Điều này cũng có thể giúp bạn khám phá nếu bạn không xử lý tất cả các kết nối của mình.

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