Веб-приложения ASP.NET 2.0-4.0 испытывают очень медленный начальный запуск. - PullRequest
18 голосов
/ 10 января 2012

(Извините, если это действительно длинный вопрос, он называется конкретным)

Компания, в которой я работаю, имеет несколько сайтов, которые работают в течение некоторого времени без проблем. Приложения представляют собой смесь ASP.NET 2.0, 3.5 и 4.0, все из которых используют ADO.NET для подключения к стандартному экземпляру SQL Server (на том же веб-сервере), все они размещены на IIS7.

Проблема началась, когда мы перешли на обновленный веб-сервер. Мы приложили все усилия, чтобы настроить сервер, экземпляр БД и IIS с точно такими же настройками (за исключением имени другого компьютера и того факта, что мы обновили SQLExpress до Standard), и, насколько мы могли судить, мы сделали , Оба сервера работают под управлением Windows Server 2008 R2 (применены все текущие обновления) и получили установку по умолчанию.

Проблема очень очевидна при запуске одного из этих приложений. Когда вы попадаете на страницу входа в наше приложение, сама страница загружается очень быстро. Это верно даже в том случае, если вы загружаете страницу с нового компьютера, который не может кэшировать страницу с отключенным кэшированием IIS. Проблема на самом деле видна, когда вы вводите данные для входа и нажимаете кнопку входа. Из-за (не очень хорошего) дизайна наших баз данных процесс входа в систему должен иметь доступ к нескольким базам данных, теоретически до 150 отдельных БД, но на практике обычно 2. Проблема возникает, даже когда открыты только 2 базы данных (минимум). Не очень хороший дизайн, но мы должны жить с ним сейчас.

При попытке первоначально открыть соединение с базой данных весь процесс останавливается примерно на 20 секунд каждый раз, независимо от того, подключаетесь ли вы к 2 дБ или к 40. Я запустил профилировщик .NET (точечная трассировка jetbrains) против процесса, и единственная информация, которую я мог извлечь из этого, была то, что один или все вызовы sqlconnection.open () составляли 90% времени. Это происходит только при первом использовании приложения, но проблема усугубляется тем фактом, что IIS, похоже, игнорирует параметры переустановки, которые мы для него установили, и перезапускает приложение после нескольких минут простоя, вызывая проблему снова ,

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

В ходе исследования проблемы я попробовал пару решений

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

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

  • несколько других исправлений кода, ни одно из которых не имело никакого значения. Причиной проблемы является настройка SqlServer?

  • другие вещи, которые я уже забыл.

Буду очень признателен за любые идеи, опыт или что-то еще, чтобы помочь мне решить эту проблему!

Ответы [ 3 ]

18 голосов
/ 10 января 2012

Я бы посоветовал использовать не-tcp-соединение, если вы все еще запускаете экземпляр SQL на локальном компьютере.SQL Server поддерживает несколько протоколов, более распространены tcp, именованные каналы и разделяемая память.

Именованные каналы

Data Source=np:computer\instance

Общая память

Data Source=lpc:computer\instance

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

см. http://msdn.microsoft.com/en-us/library/ms187892.aspx

Сброс IIS

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

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

1 голос
/ 10 января 2012

Некоторые идеи:

  • с веб-сервера, можете ли вы пропинговать сервер БД и получить «нормальный» ответ, или вы видите похожую задержку?
  • если вы видите задержку, запустите tracert, чтобы увидеть, можете ли вы определить, где происходит медлительность
  • , попробуйте использовать такой инструмент, как QueryExpress (http://www.albahari.com/queryexpress.aspx), который не требуетУстановка для запуска. Вы можете скачать этот EXE и запустить его с вашего веб-сервера. Посмотрите, можете ли вы подключиться к вашей БД, используя это, и выполнять запросы обычным способом.1011 * чтобы взглянуть на ваши открытые соединения и посмотреть, какие действия происходят на вашем сервере и сколько данных отправляется и принимается с вашего сервера БД.

Просто некоторые первые мысли о том, где яначал бы искать на основе вашего описания проблемы. Надеюсь, это поможет. Удачи в делах!

0 голосов
/ 10 января 2012

Если IIS не учитывает настройки утилизации: перезапуск IIS / перезагрузка изменили поведение?

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