Виправлення повільного початкового навантаження для IIS


129

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

Я шукав рішення проблеми і знайшов ці потенційні рішення.

A. Використовуйте плагін ініціалізації додатків

B. Використовуйте Автозапуск з .NET 4

C. Вимкнути час очікування (під II Скидання)

D. Попередньо складіть сайт

Мені цікаво, який із них є кращим, і що ще важливіше, чому існує стільки рішень однієї проблеми? (Думаю, це не так, і я просто щось неправильно не розумію).

Редагувати

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

Я врешті-решт просто повинен був зробити сценарій розминки, щоб періодично потрапляти на мій сайт, щоб переконатися, що він залишається швидким.


Привіт друже, чи вистачає виконання C? Чому? Нам потрібно лише використовувати його чи потрібно також відключити переробку? Я завжди відчуваю, що перший запит на другий день дуже повільний з IIS7.5
qakmak

Відповіді:


36

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

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

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

Окрім того, що пул додатків вимикається у разі неактивності користувачів, пул додатків також перероблятиметься за замовчуванням кожні 1740 хвилин (29 годин).

З технології:

Басейни додатків Інтернет-інформаційних служб (IIS) можуть періодично перероблятися, щоб уникнути нестабільних станів, які можуть призвести до збоїв у програмі, зависань або витоку пам'яті.

Поки рециркуляція пулу додатків залишається увімкненою, її має бути достатньо. Але якщо ви дійсно хочете найкращої продуктивності для більшості компонентів, вам також слід використовувати щось на зразок модуля ініціалізації додатків, який ви згадали.


Тож чи рекомендуєте ви просто відключити час очікування? Чи можуть це викликати проблеми уздовж лінії (я здогадуюсь, це там є причина)?
Кавін ВонДейлен

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, щоб додати бібліотеку, яка буде завантажувати вашу сторінку.

ТАКОЖ : переконайтеся, що ви змінили змінну 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

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

У спільному хостинговому просторі сценарії розминки - найкраща захист першого рівня (самодопомога - найкраща допомога). Ось стаття, яка ділиться ідеєю про те, як це зробити з власного веб-додатку .


щойно оновив цю стару тему, на випадок, коли хтось шукає те саме
Девід Челлі

2

Я б використовував B, оскільки спільно з переробкою робочих процесів означає, що буде лише затримка під час його переробки. Це дозволяє уникнути затримки, зазвичай пов'язаної з ініціалізацією у відповідь на перший запит після очікування. Ви також можете зберегти переваги утилізації.


2

Хорошим варіантом пінг-сайту на графік є використання Microsoft Flow, який безкоштовний до 750 «запускає» на місяць. Дуже легко створити потік, який щогодини потрапляє на ваш сайт, щоб він був теплим. Ви навіть можете обійти їх обмеження в 750, створивши єдиний потік із затримками, що розділяють кілька звернень вашого сайту.

https://flow.microsoft.com


1

Дивіться цю статтю, щоб отримати поради щодо вирішення питань щодо ефективності. Це стосується обох питань щодо продуктивності, пов'язаних із запуском, у розділі "холодний старт". Більшість із цього не матиме значення незалежно від типу сервера, який ви використовуєте, локально чи у виробництві.

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-isissue-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, додавши generatorPublisherEvidence = "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


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.