Solución de problemas de consultas lentas resultantes de ASYNC_NETWORK_IO tipo de espera
Síntomas
Cuando SQL Server genera conjuntos de resultados y los envía a una aplicación cliente colocando los resultados en un búfer de salida, la aplicación cliente los captura del búfer de salida. Si la aplicación cliente se detiene o no captura los resultados lo suficientemente rápido, SQL Server tiene que esperar a que se confirme que la aplicación cliente ha recibido todos los resultados antes de enviar más resultados. Esta espera se mostrará como ASYNC_NETWORK_IO
. Para obtener más información, vea el vídeo de Understanding ASYNC_NETWORK_IO Waits in SQL Server (Descripción de las esperas de ASYNC_NETWORK_IO en SQL Server).
Las esperas excesivas ASYNC_NETWORK_IO pueden causar dos problemas:
Las consultas pueden ralentizarse porque su duración total será más larga.
Cuando SQL Server espera a que el cliente capture los resultados, no puede liberar los bloqueos adquiridos. Si el bloqueo no se libera durante mucho tiempo, se bloquearán otras sesiones en SQL Server.
Causas y resoluciones
En las secciones siguientes se enumeran las causas comunes de este tipo de espera y los pasos correspondientes para resolver el problema:
Conjunto de resultados grande
Algunos clientes de aplicación solicitan miles o incluso millones de filas y, a continuación, procesan los resultados mediante la aplicación de filtros, ordenación y agregaciones. Los conjuntos de resultados grandes pueden dar lugar a un uso innecesario de la red y al procesamiento de aplicaciones cliente.
Resolución: Los desarrolladores de aplicaciones deben equilibrar cuidadosamente el procesamiento entre SQL Server y clientes. El filtrado o las agregaciones se pueden realizar mediante SQL Server y el conjunto de resultados final puede ser pequeño. Limite el conjunto de resultados que llega a los clientes. Cualquier cálculo más sobre los datos, la presentación y el formato son más adecuados en el lado cliente, una vez que se reciben los datos.
La aplicación no captura los resultados lo suficientemente rápido
Si la aplicación cliente no captura los resultados lo suficientemente rápido y no notifica a SQL Server que se ha recibido el conjunto de resultados, la ASYNC_NETWORK_IO
espera se producirá en el servidor.
Para ilustrar el uso de ADO.NET, de forma predeterminada, DataSet y DataTable capturarán todas las filas hasta su finalización antes de que el cliente pueda acceder a él. Sin embargo, clases como SqlDataReader permiten al desarrollador de aplicaciones elegir qué hacer después de capturar cada fila del servidor. Una aplicación puede capturar una fila a la vez y, a continuación, procesar esta fila según los requisitos empresariales. Por ejemplo:
Escriba la fila en un archivo.
Envíe la fila a otra aplicación a través de la red.
Espere algún tiempo o la entrada del usuario.
Resolución: Para resolver el problema, capture todos los resultados tan rápido como el cliente pueda mediante un bucle WHILE/FOR ajustado. Esto significa almacenar los resultados en memoria y solo después realizar más procesamiento.
La máquina de la aplicación cliente está bajo estrés (E/S, memoria o CPU)
Incluso si el código de la aplicación se desarrolla para capturar resultados lo más rápido posible, los problemas de recursos del sistema pueden hacer que todo el proceso de cliente sea lento. Por ejemplo:
Es posible que la aplicación no capture rápidamente los resultados si la máquina que ejecuta la aplicación cliente tiene restricciones de recursos. Por ejemplo:
Uso de CPU del 100 %
Memoria insuficiente (se consume toda la memoria)
E/S lenta (quizás la aplicación escriba resultados o registros)
Estas restricciones de recursos pueden provocar un procesamiento lento de los resultados entrantes y provocar que SQL Server experimenten el tipo ASYNC_NETWORK_IO
de espera .
Resolución: Para resolver este problema, use herramientas como Monitor de rendimiento para diagnosticar el sistema que ejecuta la aplicación y, a continuación, eliminar las restricciones de recursos. Uno de los métodos siguientes puede funcionar para usted:
Impedir que se ejecuten otras aplicaciones.
Corrija los problemas de código en esas aplicaciones.
Actualice el hardware en el sistema si las aplicaciones se han optimizado completamente.
NIC/Red
Las tarjetas de interfaz de red (NIC) o de red lentas pueden provocar retrasos en el tráfico de red y retrasarán naturalmente la captura de los resultados y la comunicación con SQL Server. Los retrasos de red suelen deberse a los siguientes problemas:
Problemas del controlador del adaptador de red
Problemas de controladores de filtro de red
Firewalls mal configurados o defectuosos
Problemas de enrutadores
Redes sobrecargadas debido al tráfico (menos comunes)
Resolución: Para diagnosticar estos problemas, puede recopilar un seguimiento de red y buscar restablecimientos y retransmisiones de paquetes. Después, puede resolver el problema relacionado con la red para eliminar los restablecimientos o retransmisiones de paquetes.