Résoudre les problèmes de requêtes lentes résultant de ASYNC_NETWORK_IO type d’attente
Symptômes
Lorsque SQL Server produit des jeux de résultats et les envoie à une application cliente en plaçant les résultats dans une mémoire tampon de sortie, l’application cliente les extrait à partir de la mémoire tampon de sortie. Si l’application cliente s’arrête ou ne récupère pas suffisamment rapidement les résultats, SQL Server doit attendre l’accusé de réception que l’application cliente a reçu tous les résultats avant d’envoyer plus de résultats. Cette attente s’affiche comme ASYNC_NETWORK_IO
suit . Pour plus d’informations, consultez la vidéo de Understanding ASYNC_NETWORK_IO Waits dans SQL Server.
Des attentes excessives ASYNC_NETWORK_IO peuvent entraîner deux problèmes :
Les requêtes peuvent ralentir, car leur durée totale sera plus longue.
Quand SQL Server attend que le client récupère les résultats, il ne peut pas libérer les verrous acquis. Si le verrou n’est pas libéré pendant longtemps, d’autres sessions sont bloquées sur SQL Server.
Causes et solutions
Les sections suivantes répertorient les causes courantes de ce type d’attente et les étapes correspondantes pour résoudre le problème :
Jeu de résultats volumineux
Certains clients d’application demandent des milliers ou même des millions de lignes, puis traitent les résultats en appliquant des filtres, un tri et des agrégations. Les jeux de résultats volumineux peuvent entraîner une utilisation inutile du réseau et le traitement des applications clientes.
Résolution : les développeurs d’applications doivent équilibrer soigneusement le traitement entre SQL Server et les clients. Le filtrage ou les agrégations peuvent être effectués par SQL Server et le jeu de résultats final peut être petit. Limitez le jeu de résultats qui arrive aux clients. Plus de calculs sur les données, la présentation et la mise en forme sont plus appropriés côté client, une fois les données reçues.
L’application ne récupère pas les résultats assez rapidement
Si l’application cliente ne récupère pas les résultats suffisamment rapidement et n’avertit pas SQL Server que le jeu de résultats a été reçu, l’attente ASYNC_NETWORK_IO
se produit sur le serveur.
Pour illustrer l’utilisation de ADO.NET, par défaut, DataSet et DataTable récupèrent toutes les lignes à terminer avant que le client puisse y accéder. Toutefois, les classes comme SqlDataReader permettent au développeur d’applications de choisir ce qu’il faut faire une fois que chaque ligne est extraite du serveur. Une application peut extraire une ligne à la fois, puis traiter cette ligne en fonction des exigences métier. Par exemple :
Écrivez la ligne dans un fichier.
Envoyez la ligne à une autre application sur le réseau.
Attendez un certain temps ou une entrée utilisateur.
Résolution : Pour résoudre le problème, récupérez tous les résultats aussi rapidement que le client peut en utilisant une boucle WHILE/FOR serrée. Cela signifie que le stockage des résultats en mémoire et uniquement en effectuant davantage de traitement.
La machine d’application cliente est sous contrainte (E/S, mémoire ou processeur)
Même si le code d’application est développé pour extraire les résultats aussi rapidement que possible, les problèmes de ressources système peuvent entraîner le ralentissement de l’ensemble du processus client. Par exemple :
L’application peut ne pas extraire rapidement les résultats si l’ordinateur qui exécute l’application cliente a des contraintes de ressources. Par exemple :
Utilisation du processeur à 100 %
Mémoire insuffisante (toute la mémoire est consommée)
E/S lentes (peut-être que l’application écrit des résultats ou des journaux)
Ces contraintes de ressources peuvent entraîner un traitement lent des résultats entrants et entraîner l’expérience du type ASYNC_NETWORK_IO
d’attente SQL Server.
Résolution : pour résoudre ce problème, utilisez des outils comme Analyseur de performances pour diagnostiquer le système qui exécute l’application, puis éliminer les contraintes de ressources. L’une des méthodes suivantes peut fonctionner pour vous :
Empêcher l’exécution d’autres applications.
Corrigez les problèmes de code dans ces applications.
Mettez à niveau le matériel sur le système si les applications ont été entièrement paramétrées.
Carte réseau/réseau
Les cartes réseau lentes ou cartes d’interface réseau peuvent entraîner des retards dans le trafic réseau et retarderont naturellement l’extraction des résultats et la communication avec SQL Server. Les retards réseau sont généralement causés par les problèmes suivants :
Problèmes de pilote de carte réseau
Problèmes de pilotes de filtre réseau
Pare-feu mal configurés ou défectueux
Problèmes liés aux routeurs
Réseaux surchargés en raison du trafic (moins courant)
Résolution : pour diagnostiquer ces problèmes, vous pouvez collecter une trace réseau et rechercher des réinitialisations de paquets et des retransmites. Vous pouvez ensuite résoudre le problème lié au réseau pour éliminer les réinitialisations/retransmites de paquets.