2012-11-14 2 views
101

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

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

А. Use the Application Initialization plugin

B. Use Auto-Start with .NET 4

C. Disable the idle-timeout (under IIS Reset)

D. Precompile the site

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

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

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

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

+0

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

ответ

26

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

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

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

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

От TechNet:

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

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

+0

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

+0

На самом деле это не исправляет мою проблему (см. Мое редактирование), но я согласился с тех пор, как вы ответили на мой первоначальный вопрос. –

2

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

1

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

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

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

Если какие-либо сервера IIS не имеют исходящий доступ к Интернету, отключить список отзыва сертификатов (CRL) для проверки Authenticode бинарных файлов, добавив generatePublisherEvidence =»ложь» в 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

2

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

В общедоступном пространстве хостинга сценарии разминки являются лучшей защитой первого уровня (самопомощь - лучшая помощь). Вот статья, которая делится idea on how to do it from your own web application.

+0

только что обновил эту ветку, если кто-то ищет то же самое –

6

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

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

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 ...»

Другой тест с полезными Script

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

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

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

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

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

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"; 
    } 
} 
2

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

https://flow.microsoft.com

Смежные вопросы