Résoudre les problèmes de lenteur des requêtes résultant de ASYNC_NETWORK_IO type d’attente
Symptômes
Quand 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 les résultats assez rapidement, SQL Server devez attendre l’accusé de réception que l’application cliente a reçu tous les résultats avant d’envoyer d’autres résultats. Cette attente s’affiche sous la forme ASYNC_NETWORK_IO
. Pour plus d’informations, consultez la vidéo sur Présentation des attentes ASYNC_NETWORK_IO dans SQL Server.
Des attentes ASYNC_NETWORK_IO excessives peuvent entraîner deux problèmes :
Les requêtes peuvent ralentir, car leur durée totale sera plus longue.
Lorsque 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 une longue période, les autres sessions sont bloquées sur SQL Server.
Causes et ré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, voire des millions de lignes, puis traitent les résultats en appliquant des filtres, un tri et des agrégations. Des jeux de résultats volumineux peuvent entraîner une utilisation inutile du réseau et un traitement des applications clientes.
Résolution: Les développeurs d’applications doivent équilibrer soigneusement le traitement entre les 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. Tous les calculs supplémentaires 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 n’extrait pas les résultats assez rapidement et n’informe 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 jusqu’à la fin avant que le client puisse y accéder. Toutefois, les classes comme SqlDataReader permettent au développeur d’applications de choisir ce qu’il doit faire une fois chaque ligne extraite du serveur. Une application peut extraire une ligne à la fois, puis traiter cette ligne en fonction des besoins de l’entreprise. 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 le peut à l’aide d’une boucle WHILE/FOR étroite. Cela signifie que les résultats sont stockés en mémoire et qu’ils effectuent ensuite un traitement plus grand.
L’ordinateur de l’application cliente est soumis à des contraintes (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 ralentir 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 ralentir le traitement des résultats entrants et entraîner SQL Server rencontrer le type ASYNC_NETWORK_IO
d’attente .
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 éliminez 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
Le ralentissement du réseau ou des cartes réseau (NIC) peut entraîner des retards dans le trafic réseau et retarder 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 liés au pilote de carte réseau
Problèmes liés aux 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 les réinitialisations de paquets et les retransmites. Vous pouvez ensuite résoudre le problème lié au réseau pour éliminer les réinitialisations/retransmites de paquets.