Что вызывает «Внутренние соединения с фатальными ошибками» - PullRequest
16 голосов
/ 20 июля 2009

У меня есть несколько веб-сайтов ASP.Net (.Net v3.5), работающих на сервере с базой данных SQL 2000. В течение нескольких месяцев я получал, казалось бы, случайные исключения InvalidOperationException с сообщением «Неустранимая ошибка внутренней связи». Иногда между ними бывает несколько дней, а иногда - несколько ошибок в день.

Исключение не ограничивается одним конкретным сайтом, хотя они совместно используют бизнес и сборки доступа к данным. Кажется, ошибка всегда генерируется из SqlClient.TdsParser.Run (). Иногда он вызывается из старых вызовов SqlCommand.Execute () старой школы, а иногда - из кода Linq2Sql.

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

Мы запускаем II6 на Windows Server 2003.

Ответы [ 3 ]

22 голосов
/ 22 сентября 2009

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

Методом проб и ошибок мы в конечном итоге отследили несколько запросов SqlCommand или LINQ, чьи SqlConnection не были закрыты сразу после использования. Вместо этого из-за неаккуратного программирования, возникшего из-за неправильного понимания соединений LINQ, объекты DataContext были расположены (и соединения закрыты) только в конце запроса, а не сразу.

Как только мы реорганизовали эти методы, чтобы немедленно закрыть соединение с помощью блока «using» в C # (освобождая этот пул для следующего запроса), мы больше не получали ошибок. Несмотря на то, что мы до сих пор не знаем причину, по которой пул соединений может быть настолько запутан, мы смогли устранить все ошибки этого типа. Эта проблема была решена в связи с другой похожей ошибкой, которую я опубликовал и обнаружил здесь: Почему мой SqlCommand возвращает строку, когда она должна быть int?

2 голосов
/ 22 июля 2009

Похоже, что соединение с базой данных обрывается или истекает время ожидания.

У нас недавно были похожие проблемы при переходе на IIS 6 из IIS 5, подключающегося к SQL 2000. Наша проблема была решена путем увеличения числа доступных временных эфемерных портов.

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

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

Поиск в базе знаний Microsoft «MaxUserPort» и «TcpTimedWaitDelay» и внесение необходимых изменений в реестр. Убедитесь, что вы сделали резервную копию реестра или сервера снимков, прежде чем вносить изменения. Необходимо перезагрузить, чтобы изменения вступили в силу.

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

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

«Если вы быстро откроете и закроете 4000 сокетов менее чем за четыре минуты, вы достигнете максимального значения по умолчанию для клиентских анонимных портов, и новые попытки подключения сокетов завершатся неудачно, пока не истечет срок действия существующего набора сокетов TIME_WAIT». - от http://support.microsoft.com/kb/328476

1 голос
/ 20 июля 2009

Проверьте папку LOG вашего сервера (\ program files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ LOG или аналогичная) на наличие файлов с именами SqlDump * .mdmp и SqlDump * .txt. Если вы найдете что-нибудь, вам придется обратиться в службу поддержки.

...