Способы устранения прерывистого время ожидания SQL ошибок


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

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

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

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

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

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

14 53

14 ответов:

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

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

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

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

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

Как только вы найдете долгосрочный запрос и приложение, которое его выполняет, вы можете немедленно решить domino таймаутов, уменьшив тайм-аут для этого одного приложение ниже всех остальных (сейчас должно быть больше). Затем, вы должны проверить код, чтобы определить лучшее решение. Вы можете сократить время блокировки, зафиксировав транзакцию раньше в 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я предлагаю вам глубоко взглянуть на супер крутой SQL Server Динамические Административные Представления характеристика:

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

эта статья является хорошим началом с DMV, хотя она была написана для SQL 2005 (DMVs feature first appearance): Устранение Неполадок Производительности Проблемы в SQL Server 2005, особенно "блокирующие" главы.

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

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

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

удачи с продолжением устранение неполадок!

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

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

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

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

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

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

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

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

  6. в этот момент вернитесь к блокирующему скрипту и проверьте временные рамки, когда "внимание" пришло

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

проблема в том, что из-за плохого запроса время выполнения запроса занимает более 60 секунд или блокировка таблицы

проблема выглядит как тупик происходит; у нас есть запросы, которые блокируют запросы для завершения во времени. Тайм-аут по умолчанию для запроса составляет 60 секунд, и после этого у нас будет исключение SQLException для тайм-аута.

проверьте журналы SQL Server на наличие взаимоблокировок. Другой способ решить проблему, чтобы увеличьте время ожидания для объекта команды (временное решение).

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

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

мы испытали это с SQL Server 2012 / SP3, при выполнении запроса через объект SqlCommand из приложения C#. Команда была простым вызовом хранимой процедуры, имеющей один параметр таблицы; мы передавали список из примерно 300 целых чисел. Процедура в свою очередь вызывала три пользовательские функции и передавала таблицу в качестве параметра каждой из них. Параметр CommandTimeout был установлен на 90 секунд.

при запуске точно такой же сохраненный proc с тем же аргумент из среды SQL Server Management Studio, запрос выполняется в течение 15 секунд. Но при запуске его из нашего приложения с помощью приведенной выше установки, sqlcommand истекло время ожидания. Одна и та же команда SqlCommand (с разными, но сопоставимыми данными) успешно выполнялась в течение нескольких недель, но теперь она потерпела неудачу с любым аргументом таблицы, содержащим более 20 или около того целых чисел. Мы сделали трассировку и обнаружили, что при запуске из объекта SqlCommand база данных потратила все 90 секунд на получение блокировок и вызвала бы процедура в момент ожидания. Мы изменили время CommandTimeout, и независимо от того, какое время мы выбрали, сохраненный proc будет вызван только в самом конце этого периода. Таким образом, мы предполагаем, что SQL Server бесконечно приобретал одни и те же блокировки снова и снова, и что только тайм-аут объекта команды заставил SQL Server остановить свой бесконечный цикл и начать выполнение запроса, к тому времени было слишком поздно, чтобы добиться успеха. Моделирование этого же процесса на аналогичном сервер, использующий подобные данные, не показал такой проблемы. Нашим решением была перезагрузка всего сервера баз данных, после чего проблема исчезла.

таким образом, кажется, что есть некоторые проблемы в SQL Server, где некоторые ресурсы получает кумулятивно потребляется и никогда не освобождается. В конечном итоге при подключении через SqlConnection и запуске SqlCommand с использованием параметра таблицы SQL Server переходит в бесконечный цикл получения блокировок. Цикл завершается по таймауту Объект SqlCommand. Решение заключается в перезагрузке, по-видимому, восстановление (временное?) здравомыслие для SQL Server.

У меня была проблема, похожая на эту, и выяснилось, что это связано с настройкой .Net framework по умолчанию

Sqlcommand.Тайм-аут

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v=VS.100).aspx

значение по умолчанию составляет 30 секунд, как указано в приведенном выше url-адресе Microsoft, попробуйте установить это на большее количество секунд или, возможно, -1 перед открытием соединения, чтобы увидеть, решает ли это проблему.

Это может быть настройка в веб.config или App.файлы конфигурации или на вас файлы конфигурации приложения / веб-сервера.