Por que ocorrem os tipos de espera async_network_io?

10

Na semana passada, algo estranho aconteceu em nosso banco de dados. De repente, o aplicativo foi bloqueado para nossos usuários que não puderam salvar novas entidades etc. Depois de examinar o Monitor de Atividade do SQL Server (2008 com modo de compatibilidade 2005), vi as três entradas a seguir:

tipos de espera async_network_io

Após algum tempo, os usuários tiveram um tempo limite de conexão. Quando eu matei o processo 64, eles poderiam salvar normalmente novamente.

O problema é que as entidades que eles tentaram salvar durante o bloco foram inseridas no banco de dados mais de uma vez (até 3 vezes), embora exista um código que impeça que isso aconteça (coluna numérica que deve ser única, mas sem restrições) ... a verificação acontece no código).

Usamos o Entity Framework 6.0.

  • Alguém sabe por que e quando esses tipos de espera ASYNC_NETWORK_IO ocorrem e como evitá-los?
  • E o que exatamente eles significam?
xerafim
fonte
11
Dê uma olhada neste artigo de Doug Lane: brentozar.com/archive/2015/07/… Isso pode abordar o que você está vendo com a EF.
Kris Gruttemeyer
Artigo muito interessante! Obrigado, eu vou ter um olhar para ele :)
xeraphim
11
Verifique o repositório de estatísticas de espera - ASYNC_NETWORK_IO . Use o script que Paulo fornece para verificar se há outros problemas.
Kin Shah

Respostas:

12

ASYNC_NETWORK_IOde alguma forma, indica que o aplicativo cliente não está processando os resultados tão rapidamente quanto o SQL Server os alimenta. Isso pode ser causado por um problema com o aplicativo cliente ou com a conexão de rede entre o servidor e o aplicativo cliente.

Consulte um post de Thomas LaRock

A espera ASYNC_NETWORK_IO indica que um dos dois cenários está acontecendo. O primeiro cenário é que a sessão (ou seja, SPID) aguarda o aplicativo cliente processar o conjunto de resultados e enviar um sinal ao SQL Server de que está pronto para processar mais dados. A segunda é que pode haver um problema de desempenho da rede.

ou este post de Joe Sack

Como você já deve saber, os tipos de espera ASYNC_NETWORK_IO (visto no SQL 2005) e NETWORKIO (visto no SQL 2000) estão associados a um aplicativo de chamada que não está processando resultados com rapidez suficiente no SQL Server ou está associado a um problema de desempenho da rede .

Como você está usando entity framework este post de Brent Ozar também pode ser útil

Observando as estatísticas de espera dessas consultas, vi que havia muito ASYNC_NETWORK_IO - geralmente mais de 1000 milissegundos. Isso também não fazia sentido! Como uma consulta com tão pouco tempo de CPU e tão poucas leituras demora tanto para ser concluída? Não é como se o aplicativo estivesse pedindo milhões de linhas e não pudesse consumir os resultados com rapidez suficiente.

Tom V - tente topanswers.xyz
fonte
6

Existem alguns conceitos errados sobre o tipo de espera ASYNC_NETWORK_IO, principalmente devido ao nome que indica o problema de rede, mas é muito raro o motivo desse tipo de espera.

As esperas excessivas ASYNC_NETWORK_IO podem ocorrer em dois cenários:

  1. A sessão deve aguardar o aplicativo cliente processar os dados recebidos do SQL Server para enviar o sinal ao SQL Server de que ele pode aceitar novos dados para processamento. Esse é um cenário comum que pode refletir um design inadequado do aplicativo e é a causa mais frequente de valores excessivos do tipo de espera ASYNC_NETWORK_IO.

    Isso envolve investigar o aplicativo que está causando os valores excessivos do tipo de espera ASYNC_NETWORK_IO e frequentemente coordenar com os desenvolvedores do aplicativo que o criaram.

  2. A largura de banda da rede está no máximo. Uma Ethernet entupida causará a lenta transmissão de dados para frente e para trás do aplicativo. Isso, por si só, degradará a eficiência do aplicativo.

Muito mais detalhes podem ser encontrados nesta página

Monte Chavis
fonte