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

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

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

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

В. Использовать автозапуск с .NET 4

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

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

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

Edit

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

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

Ответ 1

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

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

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

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

От technet:

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

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

Ответ 2

Вызов веб-хостинга

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

Заголовок 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, чтобы добавить библиотеку, которая будет извлекать вашу страницу.

ТАКЖЕ: убедитесь, что вы изменили переменную String URL-адреса так, чтобы она указывала на 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";
    }
}

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

https://flow.microsoft.com

Ответ 6

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

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

Если приложение десериализует что-либо из 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 секунд во время запуска, в то время как время от времени пытается подключиться к Интернету, чтобы получить список списков списков отзыва сертификатов. 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

Ответ 7

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