Оптимізація програм, Налаштування IIS
Веб-сервер IIS, як середовище виконання веб-програми, має певний вплив на загальну продуктивність. Наприклад, чим коротший конвеєр обробки запитів у IIS, тим менше коду буде виконуватися і тим вищою буде швидкість роботи. У IIS є механізми, які можна використовувати для збільшення продуктивності програми за рахунок зниження затримок та збільшення пропускної спроможності, а також деякі механізми, які при правильному налаштуванні можуть збільшити загальну продуктивність програми.
Кешування висновку
Ми вже знаємо, що ASP.NET підтримує власний механізм кешування виводу, навіщо використовувати ще один подібний механізм у IIS? Відповідь на це запитання проста: крім сторінок ASP.NET існують інші види вмісту, який можна кешувати. Наприклад, ми можемо кешувати статичні файли зображень, що часто запитуються, або виведення власних обробників HTTP-запитів. Для цієї мети якраз і можна використовувати механізм кешування, який підтримує веб-сервер IIS.
У IIS є два механізми кешування: кеш у просторі користувача та кеш у просторі ядра.
Кешування у просторі користувача
Так само, як ASP.NET, веб-сервер IIS здатний кешувати відповіді в пам'яті, щоб відповіді на наступні запити могли надсилатися з кеша в пам'яті, без звернення до статичних файлів на диску і без програмного коду на стороні сервера.
Щоб настроїти кешування, відкрийте програму IIS Manager, виберіть свою веб-програму, відкрийте налаштування Output Caching (Кешування виводу), клацніть посилання Add (Додати) в панелі Actions (Дії), щоб додати нове правило кешування, або виберіть існуюче правило для редагування .
Щоб створити нове правилокешування у просторі користувача, додайте нове правило, введіть розширення імен файлів, які потрібно кешувати, та позначте прапорець User-mode caching (Кешування в режимі користувача) у діалозі Add Cache Rule (Додати правило кешування), як показано на малюнку нижче:

Позначивши прапорець, ви отримаєте можливість вибирати, коли кешований елемент видалятиметься з пам'яті, після оновлення файлу на диску або через деякий час з кешування. Для статичних файлів найбільше підходить варіант видалення після оновлення, тоді як визначення інтервалу часу більше підходить для динамічного вмісту. Клацнувши на кнопці Advanced (Додатково), можна отримати доступ до налаштувань, що керують кешуванням різних версій виводу (відповідно до параметрів у рядку запиту або HTTP-заголовків).
Після додавання правила кешування налаштування зберігаються у файлі web.config програми, в розділі system.webServer --> caching. Наприклад, для правила кешування сторінок .aspx терміном до 30 хвилин, з урахуванням HTTP-заголовка Accept-Language, буде згенеровано наступний код у конфігураційному файлі:
Кешування у просторі ядра
На відміну від механізму кешування у просторі користувача, що зберігає інформацію в пам'яті робочого процесу IIS, механізм кешування у просторі ядра зберігає інформацію у пам'яті драйвера HTTP.sys. Кешування в просторі ядра забезпечує більш короткий час відгуку, проте воно не завжди підтримується. Наприклад, кешування в просторі ядра не можна використовувати, коли запит містить рядок із параметрами запиту або коли запит не є анонімним запитом.
Налаштування правил кешування у просторі ядра виконується майже так само, як кешування у просторікористувача. У діалозі налаштування правила встановіть прапорець Kernel-mode caching (Кешування в режимі ядра) та виберіть бажаний спосіб кешування.
В одному правилі допускається використовувати обидва режими кешування, у просторі ядра та у просторі користувача. У цьому випадку IIS спочатку намагатиметься застосувати кешування в просторі ядра. Якщо спроба не досягне успіху, наприклад, коли запит містить рядок з параметрами, використовується кешування в просторі користувача.
Якщо вибрано варіант кешування на певний інтервал часу в обох режимах, в просторі ядра і в просторі користувача, обидва інтервали повинні збігатися, інакше в обох режимах буде використовуватися інтервал, встановлений для кешування в режимі ядра.
Налаштування пула програми
Параметри налаштування пула програми визначають, як IIS створюватиме і підтримуватиме робочі процеси, в рамках яких виконуватиметься наш код. Під час інсталяції IIS та ASP.NET створюється кілька пулів програм, залежно від встановленої версії .NET, до яких ви можете додавати нові пули, в міру розгортання додаткових веб-додатків. При створенні пула програми він отримує деякі параметри налаштування зі значеннями за умовчанням, що керують його поведінкою. Наприклад, кожен пул отримує тайм-аут простою, після якого цей пул програми зупиняється.
Розуміння значення деяких із цих налаштувань може допомогти вам налаштувати роботу пула і тим самим повніше задовольнити потреби програми.
Перезапуск
Змінюючи параметр налаштування перезапуску, можна керувати моментом, коли пул програми буде перезапускати робочий процес. Наприклад, можна організувати перезапуск робочого процесу через кожні кілька годинабо коли буде перевищено деяку межу пам'яті, що займається. Якщо з часом веб-програма починає споживати великі обсяги пам'яті (наприклад, для зберігання об'єктів), збільшення кількості перезапусків може допомогти утримувати його продуктивність на високому рівні. З іншого боку, якщо веб-програма не виявляє жодних проблем у процесі роботи, зменшення кількості перезапусків запобігає втраті інформації про стан.
Для перевірки кількості та частоти перезапуску пулу програми можна використовувати лічильник продуктивності ASP.NET\Worker Process Restarts. Якщо ви побачите занадто велику кількість перезапусків без явної причини, спробуйте зіставити отримані значення зі споживанням пам'яті додатком і навантаженням на процесор, тому що перезапуски можуть бути обумовлені перевищенням інших меж, що визначаються налаштуваннями пула програми.
Тайм-аут простою
За замовчуванням пул програми припиняє роботу через 20 хвилин простою. Якщо такі перерви в роботі очікувані, наприклад, коли всі користувачі йдуть на обід, спробуйте збільшити тайм-аут або взагалі скасувати його.
Прив'язка процесів до ядра процесора
За замовчуванням пул програми настроєний так, що може використовувати всі доступні ядра процесора. Якщо у вас є спеціалізований фоновий процес, що використовує весь процесорний час, який йому буде виділено, можете налаштувати прив'язку пула до певних ядрів, звільнивши інші для фонового процесу. Зрозуміло, при цьому також потрібно налаштувати прив'язку фонового процесу до інших ядра процесора, щоб уникнути конкуренції між ним і робочим процесом за одні й ті самі ядра.
За замовчуванням пул програми запускає один робочий процес, який обслуговує всі запити,що надходять додатку. Якщо робочому процесу доводиться одночасно обробляти кілька запитів, які конкурують за володіння одним і тим самим ресурсом, це може призвести до затримок під час підготовки відповідей.
Наприклад, якщо програма використовує патентований механізм кешування з блокуваннями, що перешкоджають одночасному додаванню елементів в кеш, при обробці запитів потрібно синхронізувати операції з ними, що призведе до затримок, які непросто виявити та усунути. Іноді можна виправити код, щоб зменшити використання блокувань, але така можливість не завжди. Інший спосіб усунення конкуренції за ресурси - запустити кілька робочих процесів, що виконують те саме додаток, кожен з яких обробляє власну підмножину запитів, усуваючи тим самим непотрібну конкуренцію.
Іншим прикладом, коли може стати в нагоді наявність декількох процесів, що виконують один і той же веб-додаток - використання 64-розрядного сервера IIS, що виконує 32-розрядний веб-додаток. 64-розрядні сервери зазвичай мають великий обсяг пам'яті, а 32-розрядна програма може використовувати не більше 2 Гбайт, що часто призводить до збільшення частоти складання сміття і, ймовірно, до перезапуску пула програми. Підтримуючи два або три робочі процеси для 32-розрядної веб-програми, можна домогтися більш повного використання пам'яті сервера, зменшити частоту складання сміття та перезапуск пула програми.
У налаштуваннях IIS пула програми можна визначити максимальну кількість робочих процесів, які можна запустити для обслуговування запитів. Якщо встановити цей параметр більше 1 (значення за замовчуванням), зі зростанням навантаження на веб-додаток для нього будуть запускатися додаткові робочі процеси, аждо вказаного максимуму. Пул програми, що має більше одного процесу, називається веб-садом (Web Garden). Щоразу, коли встановлюється з'єднання з клієнтом, воно зв'язується з робочим процесом, який обслуговуватиме запити від цього клієнта, при цьому дотримується рівномірного розподілу запитів від користувачів між процесами та зменшуються накладні витрати на конкуренцію.
Майте на увазі, що використання веб-саду має недоліки. Більша кількість робочих процесів займає більший обсяг пам'яті, виключається можливість використовувати механізм за умовчанням зберігання інформації про сеанс у пам'яті процесу, при виконанні кількох робочих одному комп'ютері, між ними може виникати конкуренція за локальні ресурси, наприклад, використання загального файлу журналу.