Каковы возможные причины выполнения sp_reset_connection длительного времени?


9

Почему выполнение sp_reset_connectionсистемной хранимой процедуры занимает больше нескольких миллисекунд, если смотреть через SQL Server Profiler?

Я взял простую трассировку из производственной системы, используя SQL Server Profiler, а затем использовал SqlNexus для ее анализа. SqlNexus указывает, что sp_reset_connection имеет наибольшую совокупную продолжительность - 33% от общей трассы. Наблюдаемая продолжительность колеблется от 0-7 секунд (от 12 до 6 833 270 микросекунд), но в среднем составляет 0,956 с.

Я понимаю, что sp_reset_connection вызывается, когда пул соединения снова используется. Я видел предположение, что это может происходить из-за посторонних следов , но, похоже, это не так.

Я читал, что делает сервер, когда вызывается sproc, но я не думаю, что что-то из этого будет проблематичным в этом случае - код не оставляет открытых транзакций или огромных временных таблиц, которые необходимо будет очистить.

Я также посмотрел на /server/199974/sp-reset-connection-taking-a-long-time-to-run, но это не помогло.

РЕДАКТИРОВАНИЕ (2013-12-23): во всех случаях чтение и запись равны 0, а ЦП почти всегда равен 0 (только два экземпляра ненулевого ЦП, оба при 16 мс).


Какие значения вы видите для чтения и записи в этом событии?
Мартин Смит

Можете ли вы предоставить больше информации о том, какие запросы вы выполняете. Особенно интересные детали, такие как, длинные или сложные транзакции, обработка XML, временные таблицы?
Эдвард Дортланд

@Martin читает и пишет 0. Обновил вопрос. (Не было доступа к данным в выходные дни.)
Целостный разработчик

@EdwardDortland большинство запросов - это довольно простые операции выбора и обновления без явных транзакций или использования временных таблиц. Фактически, обычно фактические запросы, выполняемые на этих соединениях, выполняются довольно быстро - всего несколько мс.
Целостный разработчик

@HolisticDeveloper - Я экспериментировал с выходом из открытой транзакции и мог видеть ненулевое чтение и запись там, так что согласитесь, что тогда это не выглядит так. Эта ситуация более или менее постоянна? если это так , я бы запустить расширенный захват событий трассировки RPC:Starting, RPC:Completedи ждать типов в течение короткого периода затем просмотреть данные , чтобы увидеть , что ждать типы ИСП сталкивается в течение этого времени.
Мартин Смит

Ответы:


9

Наконец-то есть время написать более подробный ответ.

Как правило, есть три основные причины, по которым простая процедура, такая как, sp_reset_connectionможет занять много времени.

  1. Вы ждете ресурсов процессора
  2. Вы заблокированы где-то на блокировке (возможно, в результате DML или конкурирующей транзакции)
  3. Ваша сеть работает медленно и требуется много времени, чтобы вернуть результат клиенту

Объявление 1) Если вы ожидаете ресурсов процессора, это должно отображаться при ожидании сигнала. Пожалуйста, смотрите мой комментарий на ваш вопрос о том, как диагностировать, если это проблема

Объявление 2) Если вы ожидаете блокировки, это лучше всего диагностируется путем сравнения двух снимков sys.dm_os_wait_stats. Смотрите эту статью о том, как это сделать:

Если вы видите долгое ожидание LCK_ [Something], запросите, sys.dm_tran_locksчтобы отследить, какие объекты заблокированы. В вашем случае я бы ожидал, что какая-то форма SCH- [Something]> блокирует вас.

Объявление 3) Самый простой способ диагностики проблем в сети - сначала поискать OLEDB, а ASYNC_NETWORK_IO ожидает в шаге 2 (если вы долго ждете сеть, появится один из них). Если эти ожидания высоки, используйте xperf -on latencyпрограмму мониторинга сети, такую ​​как netmon или wireshark, чтобы проверить ваши задержки. Если сеть выглядит медленной, это также может быть вызвано тем, что вызывающий сервер приложений недостаточно быстро реагирует на перезапускаемое соединение.


Я еще не видел, чтобы проблема повторялась, поэтому я не могу использовать предоставленный ответ для дальнейшей диагностики на данном этапе. Однако я принимаю ответ на основании вашей репутации эксперта по производительности SQL Server.
Целостный разработчик

2

Я только что натолкнулся на статью в КБ об ошибке, которая может быть связана с этой проблемой. В FIX: Проблемы с производительностью возникают при увеличении активности блокировки базы данных в SQL Server (KB 2926217), один из описанных симптомов - это sp_reset_connectionможет занять много времени. Исправление включено в следующие обновления:

  • Накопительное обновление 17 для SQL Server 2008 с пакетом обновления 3 (SP3)
  • Накопительное обновление 13 для SQL Server 2008 R2 с пакетом обновления 2
  • Накопительное обновление 9 для SQL Server 2012 SP1
  • Накопительное обновление 1 для SQL Server 2014

Сервер, на котором я наблюдал такое поведение, работал под управлением SQL Server 2008 с пакетом обновления 3 (SP3) с накопительным обновлением 5, поэтому возможно, что он сталкивался с этой ошибкой. Я еще не пробовал накопительное обновление (проблема не повторяется все время), поэтому я не могу проверить, исправит ли это или нет. Тем не менее, я хотел предоставить информацию на случай, если у кого-то будут такие же симптомы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.