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 las captura del búfer de salida. Si la aplicación cliente se detiene o no captura los resultados lo suficientemente rápido, SQL Server debe esperar a la confirmación de que la aplicación cliente haya 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 en Descripción de ASYNC_NETWORK_IO esperas en SQL Server.
Las esperas de ASYNC_NETWORK_IO excesivas pueden causar dos problemas:
Las consultas pueden ralentizarse porque su duración total será mayor.
Cuando SQL Server espera a que el cliente capture los resultados, no se pueden 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 aplicaciones solicitan miles o incluso millones de filas y, a continuación, procesan los resultados aplicando filtros, ordenación y agregaciones. Los conjuntos de resultados grandes pueden dar lugar a un uso de red innecesario y al procesamiento de aplicaciones cliente.
Solución: los desarrolladores de aplicaciones deben equilibrar cuidadosamente el procesamiento entre SQL Server y los clientes. SQL Server puede realizar el filtrado o las agregaciones y el conjunto de resultados final puede ser pequeño. Limite el conjunto de resultados que llega a los clientes. Cada vez más cálculos 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, se producirá la ASYNC_NETWORK_IO
espera 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 ella. Sin embargo, las 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 cada 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 para la entrada del usuario.
Solució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 la memoria y solo realizar más procesamiento.
La máquina de aplicaciones cliente está bajo estrés (E/S, memoria o CPU)
Incluso si el código de la aplicación se desarrolla para capturar los 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:
Utilización 100 % de CPU
Memoria insuficiente (se consume toda la memoria)
E/S lenta (quizás la aplicación escribe resultados o registros)
Estas restricciones de recursos pueden provocar un procesamiento lento de los resultados entrantes y hacer que SQL Server experimente el tipo ASYNC_NETWORK_IO
de espera .
Solució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:
Detenga la ejecución de otras aplicaciones.
Corrija los problemas de código en esas aplicaciones.
Actualice el hardware en el sistema si las aplicaciones se han optimizado por completo.
NIC o red
Una red o tarjetas de interfaz de red (NIC) lentas pueden provocar retrasos en el tráfico de red y, por lo tanto, retrasarán 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 con los enrutadores
Redes sobrecargadas debido al tráfico (menos común)
Solución: para diagnosticar estos problemas, puede recopilar un seguimiento de red y buscar restablecimientos y retransmisiones de paquetes. A continuación, puede resolver el problema relacionado con la red para eliminar los restablecimientos o retransmisiones de paquetes.