Тайм-аут SqlException истек без достижения - PullRequest
3 голосов
/ 21 апреля 2011

Время от времени наш сервер генерирует это известное исключение:

Истекло время ожидания.Время ожидания истекло до завершения операции, или сервер не отвечает.

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

По умолчанию время ожидания команды sqlустановлен на 30 секунд и время ожидания соединения на 15 , и мы никогда не перезаписываем их.

Я вручную воспроизвел контекст и выполнил запросы на отказ в студии управления.Их длительность составляет около 1 секунды и всегда намного выше 30 .

Но как ни странно, когда я просматриваю логи сервера, это исключение выдается сразу же по запросувызов.Я имею в виду, что запрос выполняется, и через одну миллисекунду возникает исключение.Прошу прощения, но позвольте мне посмотреть на это как выродок 8-o .

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

Ответы [ 3 ]

3 голосов
/ 24 ноября 2011

На самом деле мы все еще испытывали эти случайные таймауты даже после установки READ_COMMITED_SNAPSHOT.

Установка зеркала в асинхронном режиме не помогла, запросы, выполняемые в нескольких потоках, по-прежнему случайным образом рассчитывались по истечении примерно 1 мс, всегда в периоды занятости. С другой стороны, конкретный запрос, который вызвал тайм-аут (оператор INSERT), выполнялся очень быстро (менее 1 мс ЦП и в среднем около 10 операций чтения).

Стек вызовов был следующим:

в System.Data.ProviderBase.DbConnectionPool.GetConnection (DbConnection owningObject)

в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection)

в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection externalConnection, DbConnectionFactory connectionFactory)

в System.Data.SqlClient.SqlConnection.Open ()

Так что время ожидания не похоже на сам запрос.

Согласно этому другому сообщению: Несколько одновременных тайм-аутов соединения SQL В многопоточной службе Windows и связанном посте MSDN в блоге , говоря об ошибке ADO.NET, мы попытались установить соединение таймаут до 150 в строке подключения.

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

1 голос
/ 06 мая 2011

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

  1. Чтение зафиксированного уровня изоляции Sql Server по умолчанию, приводящего к ситуациям блокировки
  2. Некоторые действительно плохо настроенные запросы и хранимые процедуры, смешанные с безиндексными таблицами

Первая причина была исправлена ​​с помощью

ALTER DATABASE <dbName> SET READ_COMMITTED_SNAPSHOT ON

Второй с ясной переписью запросов и индексацией таблиц.

0 голосов
/ 21 апреля 2011

Я бы запустил SQL Profiler и посмотрел, какие запросы выполняются.

...