Udostępnij za pośrednictwem


Rozwiązywanie problemów z powolnymi zapytaniami, które wynikają z typu oczekiwania ASYNC_NETWORK_IO

Symptomy

Gdy program SQL Server generuje zestawy wyników i wysyła je do aplikacji klienckiej, umieszczając wyniki w buforze wyjściowym, aplikacja kliencka pobiera je z buforu wyjściowego. Jeśli aplikacja kliencka zostanie zatrzymana lub nie pobierze wyników wystarczająco szybko, program SQL Server musi poczekać na potwierdzenie, że aplikacja kliencka otrzymała wszystkie wyniki przed wysłaniem większej liczby wyników. To oczekiwanie będzie wyświetlane jako ASYNC_NETWORK_IO. Aby uzyskać więcej informacji, zobacz film wideo Opis ASYNC_NETWORK_IO oczekiwania w programie SQL Server.

Nadmierne ASYNC_NETWORK_IO oczekiwania mogą powodować dwa problemy:

  • Zapytania mogą spowalniać, ponieważ ich całkowity czas trwania będzie dłuższy.

  • Gdy program SQL Server czeka na pobranie wyników przez klienta, nie może zwolnić nabytych blokad. Jeśli blokada nie zostanie zwolniona przez długi czas, inne sesje będą blokowane w programie SQL Server.

Przyczyny i rozwiązania

W poniższych sekcjach wymieniono typowe przyczyny tego typu oczekiwania i odpowiednie kroki umożliwiające rozwiązanie problemu:

Duży zestaw wyników

Niektórzy klienci aplikacji żądają tysięcy lub nawet milionów wierszy, a następnie przetwarzają wyniki, stosując filtry, sortowanie i agregacje. Duże zestawy wyników mogą prowadzić do niepotrzebnego wykorzystania sieci i przetwarzania aplikacji klienckich.

Rozwiązanie: deweloperzy aplikacji muszą dokładnie zrównoważyć przetwarzanie między programem SQL Server i klientami. Filtrowanie lub agregacje mogą być wykonywane przez program SQL Server, a końcowy zestaw wyników może być niewielki. Ogranicz zestaw wyników, który zostanie dostarczony do klientów. Więcej obliczeń dotyczących danych, prezentacji i formatowania jest bardziej odpowiednie po stronie klienta, gdy dane zostaną odebrane.

Aplikacja nie pobiera wyników wystarczająco szybko

Jeśli aplikacja kliencka nie pobierze wyników wystarczająco szybko i nie powiadamia programu SQL Server, że zestaw wyników został odebrany, ASYNC_NETWORK_IO oczekiwanie nastąpi na serwerze.

Aby zilustrować użycie ADO.NET, domyślnie zestaw danych i tabela DataTable pobierze wszystkie wiersze do ukończenia, zanim klient będzie mógł uzyskać do niego dostęp. Jednak klasy, takie jak SqlDataReader , pozwalają deweloperowi aplikacji wybrać, co zrobić po każdym wierszu jest pobierany z serwera. Aplikacja może pobrać jeden wiersz jednocześnie, a następnie przetworzyć ten wiersz zgodnie z wymaganiami biznesowymi. Na przykład:

  • Zapisz wiersz w pliku.

  • Wyślij wiersz do innej aplikacji za pośrednictwem sieci.

  • Poczekaj trochę czasu lub na wprowadzenie danych wejściowych użytkownika.

Rozwiązanie: Aby rozwiązać ten problem, pobierz wszystkie wyniki tak szybko, jak klient może za pomocą ciasnej pętli WHILE/FOR. Oznacza to przechowywanie wyników w pamięci, a następnie wykonywanie większej ilości przetwarzania.

Maszyna aplikacji klienckiej jest obciążona (operacje we/wy, pamięć lub procesor CPU)

Nawet jeśli kod aplikacji jest opracowywany w celu jak najszybszego pobierania wyników, problemy z zasobami systemu mogą spowodować spowolnienie całego procesu klienta. Na przykład:

Aplikacja może nie pobierać szybko wyników, jeśli maszyna z uruchomioną aplikacją kliencka ma ograniczenia zasobów. Na przykład:

  • Wykorzystanie procesora na poziomie 100%

  • Niewystarczająca ilość pamięci (zużywana jest cała pamięć)

  • Powolne we/wy (być może aplikacja zapisuje wyniki lub dzienniki)

Te ograniczenia zasobów mogą prowadzić do spowolnienia przetwarzania przychodzących wyników i spowodować, że program SQL Server napotka typ ASYNC_NETWORK_IOoczekiwania.

Rozwiązanie: Aby rozwiązać ten problem, użyj narzędzi takich jak monitor wydajności, aby zdiagnozować system z uruchomioną aplikacją, a następnie wyeliminować wszelkie ograniczenia zasobów. Jedna z następujących metod może działać dla Ciebie:

  • Zatrzymaj uruchamianie innych aplikacji.

  • Rozwiąż wszelkie problemy z kodem w tych aplikacjach.

  • Uaktualnij sprzęt w systemie, jeśli aplikacje zostały w pełni dostrojone.

Karta sieciowa/karta sieciowa

Wolne sieci lub karty sieciowe (NIC) mogą powodować opóźnienia w ruchu sieciowym i naturalnie opóźnią pobieranie wyników i komunikowanie się z programem SQL Server. Opóźnienia sieci są zwykle spowodowane następującymi problemami:

  • Problemy ze sterownikiem karty sieciowej

  • Problemy ze sterownikami filtru sieciowego

  • Błędnie skonfigurowane lub uszkodzone zapory

  • Problemy z routerami

  • Przeciążone sieci ze względu na ruch (rzadziej spotykany)

Rozwiązanie: Aby zdiagnozować te problemy, możesz zebrać ślad sieci i wyszukać resetowanie pakietów i przetransmitowanie. Następnie można rozwiązać problem związany z siecią, aby wyeliminować resetowanie/przetransmitowanie pakietów.

Zobacz też

ASYNC_NETWORK_IO w usłudze sys.dm_os_wait_stats