Rozwiązywanie problemów z powolnymi zapytaniami wynikającymi z ASYNC_NETWORK_IO typu oczekiwania

Symptomy

Gdy SQL Server tworzy 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 zatrzymuje się lub nie pobiera wyników wystarczająco szybko, SQL Server musi czekać 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 wideo w temacie Understanding ASYNC_NETWORK_IO Waits in SQL Server (Omówienie ASYNC_NETWORK_IO oczekiwania w 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 SQL Server oczekuje na pobranie wyników przez klienta, nie może zwolnić nabytych blokad. Jeśli blokada nie zostanie wydana przez długi czas, inne sesje zostaną zablokowane na SQL Server.

Przyczyny i rozwiązania

W poniższych sekcjach wymieniono typowe przyczyny tego typu oczekiwania i odpowiednie kroki rozwiązywania problemu:

Duży zestaw wyników

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

Rozdzielczość: Deweloperzy aplikacji muszą starannie równoważyć przetwarzanie między SQL Server i klientami. Filtrowanie lub agregacja może być wykonywane przez SQL Server, a zestaw wyników końcowych może być mały. Ogranicz zestaw wyników docierający do klientów. Więcej obliczeń dotyczących danych, prezentacji i formatowania jest bardziej odpowiednich po stronie klienta po odebraniu danych.

Aplikacja nie pobiera wyników wystarczająco szybko

Jeśli aplikacja kliencka nie pobiera wyników wystarczająco szybko i nie powiadamia 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 danych będą pobierać wszystkie wiersze do ukończenia, zanim klient będzie mógł uzyskać do niego dostęp. Jednak klasy takie jak SqlDataReader umożliwiają deweloperowi aplikacji wybranie, co należy zrobić po pobraniu każdego wiersza z serwera. Aplikacja może pobierać jeden wiersz jednocześnie, a następnie przetwarzać ten wiersz zgodnie z wymaganiami biznesowymi. Przykład:

  • Zapisz wiersz w pliku.

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

  • Poczekaj jakiś czas lub na dane wejściowe użytkownika.

Rozdzielczość: Aby rozwiązać ten problem, pobierz wszystkie wyniki tak szybko, jak tylko klient może, używając ścisłej pętli WHILE/FOR. Oznacza to, że przechowywanie powoduje użycie pamięci i dopiero wtedy wykonuje więcej przetwarzania.

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

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

Aplikacja może nie szybko pobrać wyników, jeśli na komputerze z uruchomioną aplikacją kliencką występują ograniczenia zasobów. Przykład:

  • Wykorzystanie procesora CPU w 100%

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

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

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

Rozdzielczość: Aby rozwiązać ten problem, użyj narzędzi takich jak monitor wydajności, aby zdiagnozować system, który uruchamia 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/sieć

Powolne karty sieciowe lub karty sieciowe mogą powodować opóźnienia w ruchu sieciowym i w naturalny sposób opóźniają pobieranie wyników i komunikowanie się z SQL Server. Opóźnienia sieci są zwykle spowodowane następującymi problemami:

  • Problemy ze sterownikami karty sieciowej

  • Problemy ze sterownikami filtrów sieciowych

  • Błędnie skonfigurowane lub uszkodzone zapory

  • Problemy z routerami

  • Przeciążone sieci z powodu ruchu (rzadziej)

Rozdzielczość: Aby zdiagnozować te problemy, możesz zebrać dane śledzenia sieci i wyszukać resetowanie i ponowne przekazywanie pakietów. Następnie możesz rozwiązać problem związany z siecią, aby wyeliminować resetowanie/ponowne przekazywanie pakietów.

Zobacz też

ASYNC_NETWORK_IO w sys.dm_os_wait_stats