Partilhar via


Solucionar problemas de consultas lentas resultantes de ASYNC_NETWORK_IO tipo de espera

Sintomas

Quando SQL Server produz conjuntos de resultados e os envia para um aplicativo cliente colocando os resultados em um buffer de saída, o aplicativo cliente os busca do buffer de saída. Se o aplicativo cliente parar ou não buscar os resultados rápido o suficiente, SQL Server precisará aguardar o reconhecimento de que o aplicativo cliente recebeu todos os resultados antes de enviar mais resultados. Essa espera aparecerá como ASYNC_NETWORK_IO. Para obter mais informações, consulte o vídeo no Understanding ASYNC_NETWORK_IO Waits in SQL Server.

Esperas excessivas de ASYNC_NETWORK_IO podem causar dois problemas:

  • As consultas podem diminuir porque a duração total será maior.

  • Quando SQL Server aguarda o cliente buscar resultados, ele não pode liberar bloqueios adquiridos. Se o bloqueio não for liberado por muito tempo, outras sessões serão bloqueadas no SQL Server.

Causas e resoluções

As seções a seguir listam as causas comuns para esse tipo de espera e as etapas correspondentes para resolve o problema:

Conjunto de resultados grande

Alguns clientes de aplicativo solicitam milhares ou até milhões de linhas e processam os resultados aplicando filtros, classificação e agregações. Conjuntos de resultados grandes podem levar à utilização desnecessária da rede e ao processamento do aplicativo cliente.

Resolução: Os desenvolvedores de aplicativos devem equilibrar cuidadosamente o processamento entre SQL Server e clientes. Filtragem ou agregações podem ser executadas por SQL Server e o conjunto de resultados final pode ser pequeno. Limite o conjunto de resultados que chega aos clientes. Mais cálculos sobre os dados, apresentação e formatação são mais apropriados no lado do cliente, depois que os dados são recebidos.

O aplicativo não busca resultados rápido o suficiente

Se o aplicativo cliente não buscar resultados rápido o suficiente e não notificar SQL Server que o conjunto de resultados foi recebido, a ASYNC_NETWORK_IO espera ocorrerá no servidor.

Para ilustrar usando ADO.NET, por padrão, DataSet e DataTable buscarão todas as linhas até a conclusão antes que o cliente possa acessá-la. No entanto, classes como SqlDataReader permitem que o desenvolvedor de aplicativos escolha o que fazer depois que cada linha for buscada do servidor. Um aplicativo pode buscar uma linha por vez e processar essa linha de acordo com os requisitos de negócios. Por exemplo:

  • Escreva a linha em um arquivo.

  • Envie a linha para outro aplicativo pela rede.

  • Aguarde algum tempo ou pela entrada do usuário.

Resolução: Para resolve o problema, busque todos os resultados o mais rápido possível usando um loop WHILE/FOR apertado. Isso significa que armazenar resulta na memória e só depois fazer mais processamento.

O computador de aplicativo cliente está sob estresse (E/S, memória ou CPU)

Mesmo que o código do aplicativo seja desenvolvido para buscar resultados o mais rápido possível, problemas de recurso do sistema podem fazer com que todo o processo do cliente seja lento. Por exemplo:

O aplicativo pode não buscar resultados rapidamente se o computador que executa o aplicativo cliente tiver restrições de recurso. Por exemplo:

  • Utilização 100% da CPU

  • Memória insuficiente (toda a memória é consumida)

  • E/S lenta (talvez o aplicativo grava resultados ou logs)

Essas restrições de recurso podem levar ao processamento lento dos resultados de entrada e fazer com que SQL Server experimente o tipo ASYNC_NETWORK_IOde espera .

Resolução: Para resolve esse problema, use ferramentas como Monitor de Desempenho para diagnosticar o sistema que executa o aplicativo e, em seguida, eliminar quaisquer restrições de recurso. Um dos seguintes métodos pode funcionar para você:

  • Impedir que outros aplicativos sejam executados.

  • Corrija quaisquer problemas de código nesses aplicativos.

  • Atualize o hardware no sistema se os aplicativos estiverem totalmente ajustados.

NIC/Rede

A nic (rede lenta ou cartões de interface de rede) pode causar atrasos no tráfego de rede e naturalmente atrasará a busca dos resultados e a comunicação com SQL Server. Os atrasos de rede normalmente são causados pelos seguintes problemas:

  • Problemas do driver do adaptador de rede

  • Problemas de drivers de filtro de rede

  • Firewalls mal configurados ou defeituosos

  • Problemas de roteadores

  • Redes sobrecarregadas devido ao tráfego (menos comum)

Resolução: Para diagnosticar esses problemas, você pode coletar um rastreamento de rede e procurar redefinições e retransmissões de pacotes. Em seguida, você pode resolve o problema relacionado à rede para eliminar redefinições/retransmissões de pacotes.

Confira também

ASYNC_NETWORK_IO em sys.dm_os_wait_stats