ASYNC_NETWORK_IO chờ đợi có phải lo lắng gì không?


16

Khi xem danh sách các thủ tục được lưu trữ mất nhiều thời gian để thực hiện, người ta đứng ra gây ra sự chờ đợi nhất. Tuy nhiên, hầu hết sự chờ đợi đó (81%) là ASYNC_NETWORK_IO và tôi biết tại sao: thủ tục được lưu trữ chuyển khoảng 400 MB thông tin.

Trong tài liệu, nó nói rằng nguyên nhân của ASYNC_NETWORK_IO là do máy khách không thể theo kịp với lũ dữ liệu và điều đó có thể đúng. Tôi không chắc chắn làm thế nào để làm cho máy khách theo kịp vì tất cả những gì nó làm là gọi thủ tục được lưu trữ thông qua một ADO.NET và sau đó chỉ xử lý tập dữ liệu.

Vì vậy, được cung cấp thông tin này, tôi có nên lo lắng về loại chờ ASYNC_NETWORK_IO cho quy trình này không? Nó thực sự có ảnh hưởng đến hiệu suất máy chủ?

Thông tin bổ sung:

  • Tôi đang sử dụng gói dịch vụ 2 của SQL Server 2005.
  • Ứng dụng khách nằm trên cùng một hộp với SQL Server (Tôi biết, tôi biết ... nhưng tôi không thể làm gì với nó).

1
Cách tốt nhất để suy nghĩ về kiểu chờ đợi này là không có gì trong truy vấn của bạn gây ra nó - đó là trả lại dữ liệu cho khách hàng. Bạn cũng sẽ thấy điều này rất nhiều bạn có các bảng được liên kết trong Access. Một khả năng tùy thuộc vào ứng dụng khách của bạn là chia dữ liệu thành các phần nhỏ hơn hoặc chỉ trả lại ít dữ liệu hơn. Nếu đó không phải là một lựa chọn, có lẽ bạn sẽ bị giới hạn trong những gì bạn có thể làm để giảm bớt nó.
JNK

Ứng dụng khách có được kết nối bằng Bộ nhớ chung hoặc TCP / IP không? Là ứng dụng khách và Máy chủ SQL chia sẻ cùng một bộ lõi xử lý hay bạn đang sử dụng một kỹ thuật che dấu mối quan hệ để phân tách chúng?
Jon Seigel

Đây là loại kết nối mặc định - không có gì đặc biệt - vì vậy, nó sử dụng Bộ nhớ chung. Cả hai ứng dụng sử dụng cùng một bộ lõi - không có mối quan hệ.
AngryHacker

Là lưu trữ của bạn SAN hoặc địa phương?
Eric Higgins

@EricHiggins Chỉ là một bộ ổ cứng RAID cục bộ.
AngryHacker

Câu trả lời:


14

Như bạn đã nói, loại chờ này chỉ ra rằng ứng dụng không theo kịp SQL Server. Bây giờ điều thực sự có nghĩa là, SQL Server không thể gửi dữ liệu qua mạng nhanh như mong muốn.

Có thể có hai nguyên nhân cơ bản:

  1. Ứng dụng này được viết không hiệu quả và không xử lý các hàng đủ nhanh.
  2. Mạng được tối đa hóa.

Nếu bản thân ứng dụng quá chậm sẽ không có hoặc không có tác động đáng kể đến hiệu suất của các truy vấn khác. Mặt khác, nếu đường ống quá nhỏ, các truy vấn khác cũng không thể gửi kết quả của họ và phải chờ.

Tuy nhiên, trong trường hợp sau, bạn sẽ có tất cả các kết nối đang chờ trên ASYNC_NETWORK_IO. Bạn sẽ có thể thấy tác động đó rõ ràng.


Đối với dấu đầu dòng 1. Việc truy xuất dữ liệu được thực hiện thông qua ADO.NET bằng mã tiêu chuẩn: var dataSet = new DataSet(); var da = new SqlDataAdapter(command); da.Fill(dataSet); Vì vậy, tôi không chắc chính xác điều gì có thể chậm.
AngryHacker

Đối với dấu đầu dòng 2. Ứng dụng nằm trên cùng một hộp với SQL và kết nối thông qua phương thức Bộ nhớ chung. Vì vậy, về mặt lý thuyết nên siêu nhanh.
AngryHacker
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.