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


Устранение неполадок с медленными запросами, возникающими в результате 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, по умолчанию DataSet и DataTable будут получать все строки до завершения, прежде чем клиент сможет получить к ним доступ. Однако такие классы, как SqlDataReader , позволяют разработчику приложений выбирать, что делать после получения каждой строки с сервера. Приложение может получить по одной строке за раз, а затем обработать эту строку в соответствии с бизнес-требованиями. Например:

  • Запись строки в файл.

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

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

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

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

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

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

  • 100 % загрузка ЦП

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

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

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

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

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

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

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

Сетевая карта или сеть

Медленные сетевые карты или сетевые карты могут привести к задержкам в сетевом трафике и, естественно, задерживают получение результатов и обмен данными с SQL Server. Задержки сети обычно вызваны следующими проблемами:

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

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

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

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

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

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

См. также

ASYNC_NETWORK_IO в sys.dm_os_wait_stats