Как устранить неполадки, связанные с ошибками тайм-аута SQL - PullRequest
57 голосов
/ 12 октября 2011

У нас было несколько экземпляров в день, когда мы получаем множество ошибок времени ожидания SQL от нескольких приложений (System.Data.SqlClient.SqlException: время ожидания истекло. Время ожидания истекло до завершения операции или сервера не отвечает.) В нашей сети более 100 различных приложений, как веб-, так и настольных. Все, от VB6 и Classic ASP до .NET 4. Я могу найти все виды данных, которые показывают побочные эффекты, но не могут точно определить причину этого. Наш администратор БД говорит, что с SQL-сервером все в порядке, а ИТ-специалисты говорят, что с веб-серверами или сетью все в порядке, поэтому, конечно, я остаюсь посередине, пытаясь устранить эту проблему.

Я просто ищу предложения о том, какие еще способы устранения неполадок я могу предпринять, чтобы попытаться отследить это.

Мы запускаем SQL Server 2008 R2 в кластере. К нему подключено несколько разных серверов, начиная от Windows Server 2003 до 2008 разных разновидностей.

Вот что я сделал до сих пор:

  • Выполнение трассировки SQL для долго выполняющихся запросов и взаимоблокировок. Это не показывает взаимных блокировок во время проблем, и все долго выполняющиеся запросы совпадают с нашими ошибками тайм-аута, но выглядят как побочный эффект, не причина. Запросы, которые являются очень простыми и обычно возвращаются мгновенно, в конечном итоге занимают 30, 60 или 120 секунд. Это происходит в течение нескольких минут, после чего все начинает работать и прекрасно работает.
  • Используйте системный монитор для отслеживания соединений пула соединений. Иногда это показывает некоторые всплески числа соединений, близкие к временам тайм-аутов, но все еще даже не на полпути к пределу 100 соединений по умолчанию. Опять же, здесь нет ничего, что могло бы указывать на причину.
  • Разделение веб-приложений на разные пулы приложений. Мы пытались сузить приложения, которые, по нашему мнению, могут быть основной проблемой (наиболее болтливые и т. Д.), И поместить их в отдельные пулы приложений, но это не выглядит повлиять на что-либо или помочь нам сузить что-либо.
  • Мониторинг использования диска на SQL Server. Мы провели некоторый мониторинг на SQL-сервере и не видим пиков или каких-либо признаков проблем при возникновении этих тайм-аутов.
  • Проверено TempDB не является причиной проблемы.

Я вернусь и добавлю больше, если я подумаю о том, что еще мы попробовали. Пожалуйста, дайте мне знать о том, что делать дальше.

Ответы [ 14 ]

24 голосов
/ 18 октября 2011

Выполнение трассировки SQL для длительных запросов и взаимоблокировок.Это показывает отсутствие взаимных блокировок во время проблем, и все долго выполняющиеся запросы совпадают с нашими ошибками тайм-аута, но выглядят побочным эффектом, а не причиной.Запросы, которые являются очень простыми и обычно возвращаются мгновенно, в конечном итоге занимают 30, 60 или 120 секунд.Это происходит в течение нескольких минут, после чего все начинает работать и прекрасно работает.

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

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

12 голосов
/ 19 октября 2011

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

Если вы можете выполнить sp_who2 во время истечения времени ожидания запросов, вы можете использовать столбец BlkBy, чтобы проследить до удержания блокировки, которую все остальные ждут. Так как это происходит только несколько раз в день, у вас могут возникнуть проблемы с перехватом достаточного количества данных, если вы запускаете это вручную, поэтому я предлагаю вам настроить автоматизированную систему, чтобы выводить этот вывод на регулярной основе, или, возможно, запуск исключения тайм-аута приложения. Вы также можете использовать Монитор активности, чтобы отслеживать снижение скорости отклика запросов в режиме реального времени, как это было предложено коллегой.

Как только вы найдете длительный запрос и приложение, которое его выполняет, вы можете немедленно разрешить домино тайм-аутов, сократив время ожидания для этого одного приложения ниже всех остальных (сейчас оно должно быть длиннее). Затем вы должны проверить код, чтобы определить лучшее решение. Вы можете сократить время удержания блокировки, совершив транзакцию раньше внутри sproc, или уменьшить блокировку, требуемую запросом на чтение, с помощью подсказок, таких как NOLOCK или UPDLOCK.

Вот еще кое-что о sp_who2: http://sqlserverplanet.com/dba/using-sp_who2/

И запрос подсказок: http://msdn.microsoft.com/en-us/library/ms181714.aspx http://msdn.microsoft.com/en-us/library/ms187373.aspx

9 голосов
/ 20 октября 2011

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

Проблема, как оказалось, была связана с объемом трафика на сервере, что означало, что мы запускаем встроенную защиту от Syn Syntack Flood в Windows. Досадно, что когда вы нажимаете эту кнопку, на сервере Windows или в SQL нет зарегистрированного сообщения - вы видите только те символы, которые не могут быть установлены - это происходит потому, что Windows замедляет прием сообщений и создает очередь. С точки зрения соединения сервер, кажется, не отвечает, когда должен (он даже не подтверждает прибытие сообщения)

http://msdn.microsoft.com/en-us/library/ee377084(v=bts.10).aspx

Прокрутите вниз до SynAttackProtect, и вы увидите, что по умолчанию в Windows Server 2003 SP1 и выше было включать эту функцию по умолчанию. Это эффективный механизм защиты DDOS, и отсутствие запуска, которое он вызывает, делает невероятно трудным обнаружить, когда ваш сервер делает это.

Потребовалось 3 дня в лаборатории MS, чтобы выяснить это.

Вы упомянули 100 подключений, у нас было приложение, которое постоянно подключалось, выполняло запросы и затем отключалось, оно не поддерживало открытые подключения. Это означало, что у нас было несколько потоков на каждом подключении к машине, 10 компьютеров, несколько потоков на машину, и было сочтено, что было последовательно установлено / разорвано достаточно различных подключений для запуска защиты.

Трудно сказать, находитесь ли вы на этом уровне (поскольку он не является четко определенным пороговым значением для MS).

5 голосов
/ 22 октября 2011

Как и другие авторы, похоже, у вас проблема с блокировкой. Мы столкнулись с подобной проблемой несколько недель назад; однако, наш был гораздо более прерывистым, и часто очищался, прежде чем мы могли получить администратора базы данных на сервере для запуска sp_who2, чтобы отследить проблему.

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

Ниже приведена статья о том, как настроить этот тип уведомлений.

Если блокировка оказывается проблемой, а если вы этого еще не сделали, я бы посоветовал изучить настройку уровней изоляции на основе версий строк .

2 голосов
/ 18 октября 2011

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

Вам нужно немного поработать в обратном направлении - учитывая подмножество таблиц, которые вы видите по тайм-ауту, посмотрите, какие индексы для этих таблиц. Посмотрите на другие запросы, которые выполняются в то же время, которые касаются этих таблиц / индексов. Держу пари, вы найдете небольшой набор обновлений / вставок, делающих это.

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

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

1 голос
/ 22 октября 2011

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

  1. Поскольку это SQL Server 2008 R2, вы можете запустить SQLDiag, который входит в состав продукта. Вы можете ссылаться на книги в Интернете для более подробной информации. Вкратце, запишите сценарий трассировки и блокирования на стороне сервера.

  2. После захвата трассировки ищите событие «Внимание». Это был бы спид, получивший ошибку. Если вы фильтруете по SPID, вы увидите событие RPC: Completed перед «Attention». Проверьте время там. Это время 30 секунд? Если да, то клиент ждал 30 секунд, чтобы получить ответ от SQL, и получил «тайм-аут» [Это настройка клиента, поскольку SQL никогда не будет останавливаться и соединение]

  3. Теперь, проверьте, действительно ли выполняющийся запрос должен занимать 30 секунд?

  4. Если да, настройте запрос или увеличьте время ожидания с клиента.

  5. Если нет, то этот запрос должен ждать некоторых ресурсов (заблокирован)

  6. На этом этапе вернитесь к сценарию блокировщика и проверьте временные рамки, когда пришло «Внимание»

Выше предполагается, что проблема с SQL Server не связана с сетью!

1 голос
/ 21 октября 2011

Я видел подобные проблемы, если антивирус был установлен на сервере SQL. Функции автоматического обновления AV блокировали работу сервера и не позволяли загружать достаточное количество процессоров для SQL Server.

Кроме того, вы установили небольшое приложение на самом сервере SQL, которое проверяет, могут ли быть установлены подключения, или выполняет очень простой SQL, такой как "SELECT GETDATE ();"? Это исключило бы возможности сети.

1 голос
/ 20 октября 2011

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

Удачи с дальнейшим устранением неисправностей!

1 голос
/ 19 октября 2011

Мой опыт работы с этими проблемами (но не на SQL Server) заключается в том, что причиной проблемы часто является чрезмерная многозадачность.Если есть похожие / подключенные данные / таблицы, запрошенные (почти) в одно и то же время многими соединениями, СУБД может иметь проблемы с проверкой всей изоляции.Это не столько проблема использования диска, сколько то, что некоторые соединения ждут, когда другие сделают что-то.Синхронизация очень дорогая с точки зрения использования процессора.

На мой взгляд, 100 соединений - это слишком много.(Опять же по моему опыту) даже 20 подключений, запрошенных на одной машине, могут быть слишком оптимистичными.

1 голос
/ 18 октября 2011

Я предлагаю вам глубоко взглянуть на функцию Dynamic Management * супер крутого SQL Server:

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

Эта статья является хорошим началом для DMV, хотя она была написана для SQL 2005 (функция DMV впервые появляется): Устранение неполадок с производительностью в SQL Server 2005 , особенно в главах о блокировке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...