Czy typ oczekiwania ASYNC_NETWORK_IO nie ma się czym martwić?


16

Patrząc na listę procedur przechowywanych, których wykonanie zajmuje dużo czasu, wyróżnia się jako powodująca najwięcej oczekiwania. Jednak większość tego oczekiwania (81%) to ASYNC_NETWORK_IO i wiem dlaczego: procedura przechowywana przesyła około 400 MB informacji.

W dokumentacji stwierdza, że ​​przyczyną ASYNC_NETWORK_IO jest to, że klient nie jest w stanie nadążyć za zalewem danych i to prawdopodobnie prawda. Nie jestem pewien, jak sprawić, by klient nadążył, ponieważ wystarczy wywołać procedurę przechowywaną za pośrednictwem ADO.NET, a następnie po prostu przetwarza zestaw danych.

Biorąc pod uwagę te informacje, czy powinienem martwić się typem oczekiwania ASYNC_NETWORK_IO na tę procedurę? Czy to rzeczywiście wpływa na wydajność serwera?

Dodatkowe informacje:

  • Korzystam z dodatku Service Pack 2 dla programu SQL Server 2005.
  • Aplikacja kliencka znajduje się w tym samym pudełku co SQL Server (wiem, wiem ... ale nic nie mogę na to poradzić).

1
Najlepszym sposobem na zastanowienie się nad tym rodzajem oczekiwania jest to, że w zapytaniu nic nie powoduje - zwraca dane do klienta. Zobaczysz również, że wielu z was ma połączone tabele w Access. Jedną z możliwości w zależności od aplikacji klienckiej jest podzielenie danych na mniejsze części lub po prostu zwrócenie mniejszej ilości danych. Jeśli nie jest to opcja, prawdopodobnie ograniczysz jej możliwości.
JNK

Czy aplikacja kliencka łączy się przy użyciu pamięci współdzielonej lub TCP / IP? Czy aplikacja kliencka i SQL Server współużytkują ten sam zestaw rdzeni procesora, czy używasz techniki maskowania powinowactwa, aby je rozdzielić?
Jon Seigel

Jest to domyślny typ połączenia - nic specjalnego - więc korzysta z pamięci współdzielonej. Obie aplikacje używają tego samego zestawu rdzeni - nie ma koligacji.
AngryHacker

Czy Twoja pamięć SAN jest lokalna?
Eric Higgins

@EricHiggins Tylko lokalny zestaw dysków twardych RAIDed.
AngryHacker

Odpowiedzi:


14

Jak powiedziałeś, ten typ oczekiwania wskazuje, że aplikacja nie nadąża za programem SQL Server. To tak naprawdę oznacza, że ​​SQL Server nie może wysyłać danych przez sieć tak szybko, jak by chciał.

Mogą być dwie podstawowe przyczyny:

  1. Aplikacja jest napisana nieefektywnie i nie przetwarza wierszy wystarczająco szybko.
  2. Sieć jest maksymalnie rozwinięta.

Jeśli sama aplikacja jest zbyt wolna, nie będzie znacznego wpływu na wydajność innych zapytań lub nie będzie jej wcale. Jeśli z drugiej strony potok jest zbyt mały, inne zapytania również nie mogą wysłać swoich wyników i muszą poczekać.

W tym drugim przypadku wszystkie połączenia czekałyby na ASYNC_NETWORK_IO. Powinieneś być w stanie wyraźnie zobaczyć ten wpływ.


W przypadku punktu 1. Pobieranie danych odbywa się za pośrednictwem ADO.NET przy użyciu standardowego kodu: var dataSet = new DataSet(); var da = new SqlDataAdapter(command); da.Fill(dataSet); Nie jestem więc pewien, co dokładnie może być wolne.
AngryHacker

W przypadku punktu 2 aplikacja znajduje się w tym samym polu co SQL, a połączenie odbywa się za pomocą metody pamięci współużytkowanej. Teoretycznie powinno to być super szybkie.
AngryHacker
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.