Поделиться через


Устранение неполадок с медленными запросами, которые приводят к типу ожидания ASYNC_NETWORK_IO

Симптомы

Когда SQL Server создает результирующие наборы и отправляет их в клиентское приложение, помещая результаты в выходной буфер, клиентское приложение извлекает их из выходного буфера. Если клиентское приложение останавливается или не получает результаты достаточно быстро, SQL Server должен дождаться подтверждения того, что клиентское приложение получило все результаты, прежде чем отправлять новые результаты. Это ожидание будет отображаться как ASYNC_NETWORK_IO. Дополнительные сведения см. в видеоролике о том, как понять, ASYNC_NETWORK_IO ожидания в SQL Server.

Чрезмерные ASYNC_NETWORK_IO ожидания могут вызвать две проблемы:

  • Выполнение запросов может замедлиться, так как их общая продолжительность увеличится.

  • Пока SQL Server ожидает получения результатов на стороне клиента, он не может снять установленные блокировки. Если блокировка не снимается в течение длительного времени, то другие сеансы будут блокироваться на SQL Server.

Причины и способы устранения ошибок

В следующих разделах перечислены распространенные причины этого типа ожидания и соответствующие действия по устранению проблемы:

Большой результирующий набор

Некоторые клиенты приложений запрашивают тысячи или даже миллионы строк, а затем обрабатывают результаты путем применения фильтров, сортировки и агрегирования. Большие результирующие наборы могут привести к ненужной загрузке сети и обработке клиентских приложений.

Решение. Разработчики приложений должны тщательно сбалансировать обработку между SQL Server и клиентами. Фильтрация или агрегаты могут выполняться SQL Server, а окончательный результирующий набор может быть небольшим. Ограничить результирующий набор, поступающий клиентам. Все больше вычислений по данным, презентации и форматированию более подходящи на стороне клиента после получения данных.

Приложение не извлекает результаты достаточно быстро

Если клиентское приложение не получает достаточно быстрых результатов и не уведомляет SQL Server о том, что результирующий набор получен, ASYNC_NETWORK_IO ожидание будет происходить на сервере.

Чтобы проиллюстрировать использование ADO.NET, по умолчанию Набор данных и DataTable будут получать все строки до завершения, прежде чем клиент сможет получить к нему доступ. Однако такие классы, как SqlDataReader , позволяют разработчику приложений выбирать, что делать после получения каждой строки с сервера. Приложение может одновременно получать одну строку, а затем обрабатывать эту строку в соответствии с бизнес-требованиями. Например:

  • Запишите строку в файл.

  • Отправьте строку другому приложению через сеть.

  • Подождите некоторое время или время ввода пользователем.

Решение. Чтобы устранить проблему, получите все результаты так быстро, как клиент может использовать жесткий цикл WHILE/FOR. Это означает, что хранение результатов в памяти и только затем делает больше обработки.

Компьютер клиентского приложения находится под стрессом (операций ввода-вывода, памяти или ЦП)

Даже если код приложения разработан для получения результатов как можно быстрее, проблемы с системным ресурсом могут привести к замедлению всего клиентского процесса. Например:

Приложение может не быстро получить результаты, если компьютер, на котором запущено клиентское приложение, имеет ограничения ресурсов. Например:

  • 100 % использование ЦП

  • Недостаточно памяти (используется весь объем памяти)

  • Медленный ввод-вывод (возможно, приложение записывает результаты или журналы)

Эти ограничения ресурсов могут привести к медленной обработке входящих результатов и привести к возникновению типа ASYNC_NETWORK_IOожидания SQL Server.

Решение. Чтобы устранить эту проблему, используйте такие средства, как Монитор производительности для диагностики системы, которая запускает приложение, а затем исключите все ограничения ресурсов. Один из следующих методов может работать для вас:

  • Остановите выполнение других приложений.

  • Устранение проблем с кодом в этих приложениях.

  • Обновите оборудование в системе, если приложения настроены полностью.

Сетевой адаптер или сеть

Медленная работа сети или сетевых адаптеров (NIC) может вызвать задержки в трафике и, соответственно, задержки в получении результатов и взаимодействии с SQL Server. Как правило, задержки в работе сети обусловлены следующими причинами:

  • Проблемы с драйвером сетевого адаптера.

  • Проблемы с драйверами сетевого фильтра.

  • Неправильно настроенные или неисправные брандмауэры.

  • Проблемы с маршрутизаторами.

  • Перегруженные сети из-за трафика (менее распространено).

Решение. Чтобы диагностировать эти проблемы, можно собирать трассировку сети и искать сбросы пакетов и повторно передавать их. Затем можно устранить проблему, связанную с сетью, чтобы устранить сбросы пакетов или повторно передавать их.

См. также

ASYNC_NETWORK_IO в sys.dm_os_wait_stats