Исправление медленной начальной загрузки для IIS

129

У IIS есть раздражающая функция для веб-сайтов с низким трафиком, где он перерабатывает неиспользуемые рабочие процессы, в результате чего первый пользователь на сайте через некоторое время получает чрезвычайно долгую задержку (30+ секунд).

Я искал решение проблемы и нашел эти потенциальные решения.

A. Используйте плагин инициализации приложения

Б. Использование автозапуска с .NET 4

C. Отключите тайм-аут простоя (в разделе «Сброс IIS»)

D. Предварительно скомпилируйте сайт

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

редактировать

Выполнения C кажется достаточно, чтобы поддерживать мой сайт в горячем состоянии, но я обнаружил, что настоящая причина медлительности моего сайта связана с Entity Framework, и я не могу понять, почему он становится холодным. См. Этот вопрос, на который, к сожалению, еще нет ответа!

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

Кавин фон Дейлен
источник
Привет, друг! Достаточно ли исполнить Си? Зачем ? Нам нужно только использовать его или нужно отключить переработку? Я всегда чувствую, что первый запрос второго дня очень медленный для IIS7.5
qakmak

Ответы:

36

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

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

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

Помимо того факта, что пул приложений отключается в случае неактивности пользователя, пул приложений также будет перезапускаться по умолчанию каждые 1740 минут (29 часов).

Из technet:

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

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

Рэзван Флавиус Панда
источник
Так вы бы порекомендовали просто отключить тайм-аут простоя? Будет ли это вызывать проблемы по ходу дела (я предполагаю, что это есть причина)?
Cavyn VonDeylen
3
На самом деле это не решает мою проблему (см. Мое изменение), но я согласился, так как вы ответили на мой исходный вопрос.
Cavyn VonDeylen
10

Задача веб-хостинга

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

Накладные расходы ASP.NET MVC

Мой сайт занимает не менее 30 секунд, если на него не обращались более 20 минут (и веб-приложение было остановлено). Это ужасно.

Еще один способ проверить производительность

Есть еще один способ проверить, запускается ли это ваш ASP.NET MVC или что-то еще. Перетащите обычную HTML-страницу на свой сайт, где вы можете напрямую перейти к ней.
Если проблема связана с запуском ASP.NET MVC, HTML-страница будет отображаться почти сразу, даже если веб-приложение не было запущено.
Вот так я впервые понял, что проблема была в запуске ASP.NET MVC. Я загружал HTML-страницу в любое время, и она загружалась молниеносно. Затем, открыв эту HTML-страницу, я попадал по одному из своих URL-адресов ASP.NET MVC и получал сообщение Chrome «Ожидание raddev.us ...»

Еще один тест с помощью полезного сценария

После этого я написал сценарий LINQPad ( подробнее см. Http://linqpad.net ), который будет попадать на мой веб-сайт каждые 8 ​​минут (меньше, чем время для выгрузки приложения - которое должно быть 20 минут), и я позволил он работает часами.

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

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

ПРИМЕЧАНИЕ . В LinqPad вам нужно будет нажать F4 и добавить ссылку на System.Net, чтобы добавить библиотеку, которая будет получать вашу страницу.

ТАКЖЕ : убедитесь, что вы изменили переменную URL-адреса String, чтобы она указывала на URL-адрес, который будет загружать маршрут с вашего сайта ASP.NET MVC, чтобы двигатель работал.

System.Timers.Timer webKeepAlive = new System.Timers.Timer();
Int64 counter = 0;
void Main()
{
    webKeepAlive.Interval = 5000;
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed;
    webKeepAlive.Start();
}

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    webKeepAlive.Stop();
    try
    {
        // ONLY the first time it retrieves the content it will print the string
        String finalHtml = GetWebContent();
        if (counter < 1)
        {
            Console.WriteLine(finalHtml);
        }
        counter++;
    }
    finally
    {
        webKeepAlive.Interval = 480000; // every 8 minutes
        webKeepAlive.Start();
    }
}

public String GetWebContent()
{
    try
    {
    String URL = "http://YOURURL.COM";
    WebRequest request = WebRequest.Create(URL);
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }
    Console.WriteLine (String.Format("{0} : success",DateTime.Now));
    return html;
    }
    catch (Exception ex)
    {
        Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message));
        return "fail";
    }
}
raddevus
источник
3

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

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

Дэвид Челлия
источник
только что обновил эту старую
ветку
2

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

Комплект
источник
2

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

https://flow.microsoft.com

ЛМК
источник
1

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

https://blogs.msdn.microsoft.com/b/mcsuksoldev/2011/01/19/common-performance-issues-on-asp-net-web-sites/

Если приложение десериализует что-либо из XML (включая веб-службы…), убедитесь, что SGEN запущен для всех двоичных файлов, участвующих в десериализации, и поместите полученные библиотеки DLL в глобальный кэш сборок (GAC). Это предварительно компилирует все объекты сериализации, используемые сборками, с которыми запускался SGEN, и кэширует их в полученной DLL. Это может дать огромную экономию времени при первой десериализации (загрузке) файлов конфигурации с диска и начальных вызовах веб-служб. http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

Если какие-либо серверы IIS не имеют исходящего доступа к Интернету, отключите проверку списка отзыва сертификатов (CRL) для двоичных файлов Authenticode, добавив generatePublisherEvidence = ”false” в machine.config. В противном случае все рабочие процессы могут зависать более 20 секунд во время запуска, пока не истечет время ожидания подключения к Интернету для получения списка CRL. http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/library/bb629393.aspx

Рассмотрите возможность использования NGEN на всех сборках. Однако без осторожного использования это не дает большого прироста производительности. Это связано с тем, что адреса базовой загрузки всех двоичных файлов, которые загружаются каждым процессом, должны быть тщательно установлены во время сборки, чтобы не перекрываться. Если двоичные файлы необходимо переустановить при загрузке из-за конфликта адресов, почти весь выигрыш в производительности от использования NGEN будет потерян. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

nuzzolilo
источник
0

Я получал постоянную 15-секундную задержку при первом запросе после 4 минут бездействия. Моя проблема заключалась в том, что мое приложение использовало встроенную проверку подлинности Windows для SQL Server, а профиль службы находился в другом домене, чем сервер. Это вызвало междоменную аутентификацию с IIS на SQL при инициализации приложения - и это было настоящим источником моей задержки. Я перешел на использование входа в систему SQL вместо аутентификации Windows. Задержка сразу исчезла. У меня все еще есть все настройки инициализации приложения, которые помогают повысить производительность, но в моем случае они, возможно, вообще не понадобились.

Droobie
источник