Назад | Перейти на главную страницу

Установка тайм-аутов: SQL Server 2008 / IIS 7.5

Недавно мы перешли с системы Win 2003 / SQL Server 2000 на 64-разрядную версию Win 2008 R2, SQL Server 2008 R2.

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

На старом сервере, если я застрял в каком-то бесконечном цикле, страница выдала бы ошибку.

На новом сервере у меня есть страница с какой-то проблемой зацикливания, что, хотя SQL SP вызывается только один раз (и отлично работает как запрос на сервере), он привязывает SQL-сервер и, следовательно, блокирует все наши веб-сайты. .

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

Я не могу понять, как SP, который запускается один раз на сервере со страницы ASP, таким образом связывает SQL-сервер. Очевидно, это какая-то проблема с тайм-аутом, но я не могу понять, где / какие значения тайм-аута изменить.

Мне действительно нужно подключить удаленный рабочий стол к серверу и убить процесс на сервере SQL.

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

Как я могу это отследить? Какие настройки мне нужно изменить?

Подробнее: это не SQL Server На нашем тестовом сайте я создал файл ASP, который просто выполнял бесконечный цикл (do while 1 = 1) и имел ту же проблему - другие веб-сайты не загружались - без участия SQL-сервера. Поэтому я думаю, что причина зависания процесса в том, что время ожидания страницы не истекло, и поэтому соединение с SQL никогда не было закрыто. Завершение процесса на сервере SQL каким-то образом приведет к сбросу страницы.

Для моего намеренного бесконечного цикла мне пришлось обновить пул приложений, чтобы избавиться от него. Это больше указывает на настройки IIS или ASP.

Для тайм-аутов ASP установлено значение по умолчанию при первой загрузке сервера.

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

Для следующего парня.

Решение этой проблемы сводится к восприятию, когда кто-то - вроде меня - на самом деле не знаком с управлением серверами.

Как я уже говорил в исходном вопросе, мы только что перешли со старого сервера - Windows Server 2003 / SQL Server 2000 - на новый, который использует 64-разрядную версию Windows Server 2008 R2 и SQL Server 2008 R2. Я не настраивал исходный сервер и заплатил кому-то за перенос данных на новый сервер, дав ему инструкции: «Просто настройте его так, как был настроен старый сервер». Хех.

Старому серверу было 9 лет, машина с двумя процессорами Xeon и 1 ГБ оперативной памяти. Исходный сервер был настроен с двумя веб-сайтами - нашей системой бронирования и веб-сайтом компании - оба использовали один и тот же пул приложений. По мере того, как веб-сайты добавлялись с годами, они добавлялись в пул приложений по умолчанию. С нашими проблемами с ресурсами это было лучшее, что мы могли сделать. И в какой-то момент кто-то должен был установить очень короткое значение тайм-аута, вероятно, из-за того, что сервер временами был немного забит.

Новый сервер имеет 32 ГБ оперативной памяти и 4-ядерный процессор. Но нанятый мною консультант сделал именно то, что я просил - почти - и настроил все так, как было на старом сервере, в том числе поместил все веб-сайты в один пул приложений. Единственное, что он, по-видимому, не сделал, так это установил для таймаута более короткое значение, которое должно было быть установлено на старом сервере.

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

Все сводилось к предположениям / восприятию: таймаут на старом сервере был достаточно коротким, чтобы при отладке чего-то Я так и не понял, что все сайты заблокированыпоскольку это было всего на 15 или 20 секунд, тогда время ожидания страницы истекало, я исправлял это и шел дальше. Однако, когда тайм-аут установлен на 120 секунд, это совсем другая игра. Поскольку SQL Server был остановлен, я подумал, что это проблема SQL Server, но он завис, потому что запись и соединение не были закрыты, потому что страница застряла в цикле ... так что это только появился этот SQL-сервер был частью проблемы.

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

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

Лучшее, что можно сделать, - это исправить свой код.

Выясните, какой код выполняется долго (используйте SQL Profiler, просмотрите планы запросов или просто внимательно следите за своим кодом, пока вы его не изучите) и устраните проблему. Это может быть код, индексация, устаревшая статистика, блокировка от чего-то еще, медленное хранилище или еще много чего.

Хорошо, готово.

Если вы хотите изменить тайм-аут запроса, чтобы все работало, пока вы выясняете, что сломано, вам нужно заглянуть в свой код, чтобы найти, где вы создаете объекты запроса ADO (наборы результатов, объекты команд и т. Д.), И измените файл. QueryTimeout и / или .CommandTimeout свойства.

IIRC, значение по умолчанию для этих свойств составляет 60 секунд. Сделайте это «достаточно длинным». AFAIK, нет глобального способа установить .QueryTimeout и / или .CommandTimeout на глобальном уровне IIS или приложения, но я не парень IIS / ASP, я администратор баз данных.

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

Нет простого способа уничтожить запросы, которые выполняются «слишком долго» в SQL 2008.

«Тайм-аут запроса», который вы видите в диалоговых окнах «Свойства» SQL Server, связан с тайм-аутом для связанных серверов. IOW, который контролирует значение тайм-аута для локального сервера, когда он действует как клиент и подключается к удаленному серверу от вашего имени. (На практике это похоже на изменение значений QueryTimeout в ваших объектах запроса, но все это внутри SQL Server.) Это вам не поможет.

Старый «регулятор запросов», когда он настроен, оценивает, сколько времени займет запрос, и всегда ошибался всякий раз, когда я пытался его использовать. Все, кого я видел, говорили об этом, находили это разочаровывающим. Вы можете заметить, что «регулятор ресурсов» предназначен для ограничения использования ОЗУ и ЦП, а не времени. Следовательно, вы этого совсем не хотите.

Вы могли бы написать что-нибудь, что убивало бы запросы. НО:

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

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