¿Por qué ocurren los tipos de espera async_network_io?

10

La semana pasada sucedió algo extraño en nuestra base de datos. De repente, la aplicación se bloqueó para nuestros usuarios que no pudieron guardar nuevas entidades, etc. Después de mirar el Monitor de actividad del servidor SQL (2008 con el modo de compatibilidad 2005) vi las siguientes tres entradas:

Tipos de espera async_network_io

Después de un tiempo, los usuarios obtuvieron un tiempo de espera de conexión. Cuando eliminé el proceso 64, pudieron volver a guardar normalmente.

El problema es que las entidades que intentaron guardar durante el bloque se insertaron en la base de datos más de una vez (hasta 3 veces) a pesar de que hay un código que debería evitar que esto suceda (columna de números que debe ser única pero sin restricciones ... la verificación ocurre en el código).

Utilizamos Entity Framework 6.0.

  • ¿Alguien de ustedes sabe por qué y cuándo ocurren estos tipos de espera ASYNC_NETWORK_IO y cómo evitarlos?
  • ¿Y a qué se refieren exactamente?
xeraphim
fuente
1
Eche un vistazo a este artículo de Doug Lane: brentozar.com/archive/2015/07/… Esto puede abordar lo que está viendo con EF.
Kris Gruttemeyer
Artículo muy interesante! Gracias, lo echaré un vistazo :)
xeraphim
1
Consulte el repositorio de estadísticas de espera: ASYNC_NETWORK_IO . Use la secuencia de comandos que Paul proporciona para ver si hay otros problemas.
Kin Shah

Respuestas:

12

ASYNC_NETWORK_IOde alguna manera indica que la aplicación cliente no está procesando resultados tan rápido como SQL Server los alimenta. Esto podría deberse a un problema con la aplicación cliente o con la conexión de red entre el servidor y la aplicación cliente.

Consulte una publicación de Thomas LaRock

La espera ASYNC_NETWORK_IO indica que uno de los dos escenarios está sucediendo. El primer escenario es que la sesión (es decir, SPID) está esperando que la aplicación del cliente procese el conjunto de resultados y envíe una señal de regreso a SQL Server de que está lista para procesar más datos. El segundo es que puede haber un problema de rendimiento de la red.

o esta publicación de Joe Sack

Como ya sabrá, los tipos de espera ASYNC_NETWORK_IO (visto en SQL 2005) y NETWORKIO (visto en SQL 2000) están asociados con una aplicación de llamada que no procesa resultados lo suficientemente rápido desde SQL Server o está asociada con un problema de rendimiento de la red .

Ya que estás usando entity framework esta publicación de Brent Ozar también puede ser útil

Al observar las estadísticas de espera para estas consultas, vi que había una gran cantidad de ASYNC_NETWORK_IO, a menudo más de 1000 milisegundos. ¡Eso tampoco tenía sentido! ¿Cómo puede llevar tanto tiempo completar una consulta con tan poco tiempo de CPU y tan pocas lecturas? No es que la aplicación pidiera millones de filas y no pudiera consumir los resultados lo suficientemente rápido.

Tom V - prueba topanswers.xyz
fuente
6

Hay algunas ideas erróneas sobre el tipo de espera ASYNC_NETWORK_IO, principalmente debido al nombre que indica el problema de la red, pero es muy raro el motivo de este tipo de espera.

Las esperas excesivas de ASYNC_NETWORK_IO podrían ocurrir bajo dos escenarios:

  1. La sesión debe esperar a que la aplicación del cliente procese los datos recibidos de SQL Server para enviar la señal a SQL Server de que puede aceptar nuevos datos para su procesamiento. Este es un escenario común que puede reflejar un mal diseño de la aplicación, y es la causa más frecuente de valores de tipo de espera ASYNC_NETWORK_IO excesivos.

    Esto implica investigar la aplicación que está causando los valores de tipo de espera ASYNC_NETWORK_IO excesivos y, a menudo, coordinarse con los desarrolladores de aplicaciones que la crearon.

  2. El ancho de banda de la red está al máximo. Una red Ethernet obstruida provocará la lenta transmisión de datos desde y hacia la aplicación. Esto, en sí mismo, degradará la eficiencia de la aplicación.

Se pueden encontrar muchos más detalles en esta página

Monte Chavis
fuente