Felsöka långsamma frågor som beror på ASYNC_NETWORK_IO väntetyp
Symptom
När SQL Server genererar resultatuppsättningar och skickar dem till ett klientprogram genom att placera resultatet i en utdatabuffert hämtar klientprogrammet dem från utdatabufferten. Om klientprogrammet stoppas eller inte hämtar resultaten tillräckligt snabbt måste SQL Server vänta på en bekräftelse att klientprogrammet har tagit emot samtliga resultat innan fler resultat kan skickas. Den här väntan visas som ASYNC_NETWORK_IO
. Mer information finns i videon på Understanding ASYNC_NETWORK_IO Waits in SQL Server (Förstå ASYNC_NETWORK_IO väntetider i SQL Server).
Överdrivna ASYNC_NETWORK_IO väntetider kan orsaka två problem:
Frågor kan bli långsammare eftersom hanteringen av dem tar längre tid.
När SQL Server väntar på att klienten ska hämta resultat kan den inte frigöra tidigare hämtade lås. Om låset inte frigörs under lång tid blockeras andra sessioner på SQL Server.
Orsaker och lösningar
I följande avsnitt visas de vanligaste orsakerna till den här väntetypen och motsvarande steg för att lösa problemet:
Stor resultatuppsättning
Vissa programklienter begär tusentals eller till och med miljontals rader och bearbetar sedan resultaten genom att tillämpa filter, sortering och aggregeringar. Stora resultatuppsättningar kan leda till onödig nätverksanvändning och bearbetning av klientprogram.
Lösning: Programutvecklare måste noggrant balansera bearbetningen mellan SQL Server och klienter. Filtrering eller sammansättningar kan utföras av SQL Server och den slutliga resultatuppsättningen kan vara liten. Begränsa den resultatuppsättning som kommer till klienterna. Alla fler beräkningar över data, presentation och formatering är lämpligare på klientsidan när data har tagits emot.
Programmet hämtar inte resultat tillräckligt snabbt
Om klientprogrammet inte hämtar resultat tillräckligt snabbt och inte meddelar SQL Server att resultatuppsättningen har tagits emot ASYNC_NETWORK_IO
sker väntan på servern.
För att illustrera användningen av ADO.NET hämtar DataSet och DataTable som standard alla rader till slutförande innan klienten kan komma åt den. Klasser som SqlDataReader gör det dock möjligt för programutvecklaren att välja vad de ska göra när varje rad hämtas från servern. Ett program kan hämta en rad i taget och sedan bearbeta den här raden enligt affärskraven. Till exempel:
Skriv raden till en fil.
Skicka raden till ett annat program via nätverket.
Vänta en stund eller på användarindata.
Lösning: Lös problemet genom att hämta alla resultat så snabbt som klienten kan med hjälp av en stram WHILE/FOR-loop. Det innebär att lagra resultat i minnet och bara sedan göra mer bearbetning.
Klientprogramdatorn är överbelastad (I/O, minne eller CPU)
Även om programkoden har utvecklats för att hämta resultat så snabbt som möjligt kan problem med systemresurser göra att hela klientprocessen blir långsam. Till exempel:
Programmet kanske inte snabbt hämtar resultat om den dator som kör klientprogrammet har resursbegränsningar. Till exempel:
100 % processoranvändning
Otillräckligt minne (allt minne förbrukas)
Långsam I/O (kanske programmet skriver resultat eller loggar)
Dessa resursbegränsningar kan leda till långsam bearbetning av inkommande resultat och leda till att SQL Server upplever väntetyp ASYNC_NETWORK_IO
.
Lösning: Lös problemet genom att använda verktyg som Prestandaövervakaren för att diagnostisera systemet som kör programmet och sedan eliminera eventuella resursbegränsningar. En av följande metoder kan fungera för dig:
Stoppa andra program från att köras.
Åtgärda eventuella kodproblem i dessa program.
Uppgradera maskinvaran i systemet om programmen har finjusterats helt.
Nätverkskort/nätverk
Långsamma nätverk eller nätverkskort (NIC) kan ge upphov till fördröjningar i nätverkstrafiken och fördröjer naturligtvis hämtningen av resultaten och kommunikationen med SQL Server. Nätverksfördröjningar orsakas vanligtvis av följande problem:
Problem med drivrutiner för nätverkskort
Problem med drivrutiner för nätverksfilter
Felkonfigurerade eller felaktiga brandväggar
Problem med routrar
Överbelastade nätverk till följd av hög trafik (mindre vanligt)
Lösning: Om du vill diagnostisera dessa problem kan du samla in en nätverksspårning och leta efter paketåterställningar och återöverföringar. Du kan sedan lösa det nätverksrelaterade problemet för att eliminera paketåterställning/återöverföringar.