Настройка кэширования вывода IIS 7

Введение

Internet Information Services 7 (IIS 7) включает в себя функцию кэширования вывода, с помощью которой можно кэшировать в память динамический контент PHP (или вывод данных из Microsoft ® ASP.NET или классического ASP, или других динамических страниц). Это может принести огромное повышение производительности, поскольку скрипт, обычно создаваемый для динамического вывода данных, не нуждается в запуске для каждого запроса. Кэширование может изменить выводимые данные, которые кэшируется на основе значений строки запроса, а также заголовков HTTP, посылаемых от клиента к серверу. Кэширование также интегрируется с драйвером Http.sys в режиме ядра, повышая производительность.

Когда использовать кэширование вывода

Веб-контент можно разделить на две основные категории: статический и динамический.

  • Статический контент не меняется от запроса к запросу. Контент, который возвращается на веб браузер, всегда один и тот же. Примерами статического контента могут служить файлы HTML, JPG или GIF.
  • Динамический контент выводится при изменениях с каждым запросом. В качестве примера может служить контент ASP.NET или PHP.

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

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

Функция кэширования вывода IIS 7 направлена на полу-динамический контент. Это позволяет кэшировать статические ответы для динамических запросов и увеличить масштабируемость.

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

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

Выбор политики кэширования

IIS поддерживает два типа политики кэширования:

  • varyByQuerystring, при которой URL-адрес тот же самый, но значение строки запроса меняется.
  • varybyHeaders, при которой можно изменять кэш-память на основе заголовков HTTP, которые посылаются от клиента к серверу.

Недействительное кэширование

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

IIS поддерживает два способа инвалидации динамического контента:

  • Использование простого периода интервала – свойство конфигурации CacheForTimePeriod. Обнаружение изменения в основном ресурсе – свойство конфигурации CacheUntilChange.<0}  Используйте данный тип схемы инвалидации только тогда, когда есть желание очистить кэш-память при изменениях основного ресурса.

Настройка значения, достойного внимания для кэширования

Даже при активации кэширования вывода IIS 7 не сразу кэширует запрос. Запрос должен быть заявлен несколько раз, прежде чем IIS посчитает запрос "достойным внимания". Настройку значения, достойного внимания для кэширования, можно выполнить в разделе ServerRuntime, описанного в Microsoft® Developer Network (MSDN®) MSDN article.

Два свойства определяют значение, достойное внимания для кэширования:

  • frequentHitTimePeriod
  • frequentHitThreshold

Запрос кэшируется только в случае, если большое количество запросов <frequentHitThreshold> для кэшируемых URL-адресов приходят во время <frequentHitTimePeriod>. Настройка по умолчанию для frequentHitTimePeriod составляет 10 секунд. Настройка по умолчанию для frequentHitThreshold составляет 2 секунды.

Настройка кэширования вывода с помощью IIS Manager

Кэш довольно легко настроить с помощью функции пользовательского интерфейса в новом инструменте администрирования IIS.

  1. Из меню Start (Пуск) нажмите на Administrative Tools (Инструменты администрирования), а затем нажмите на Internet Information Services (IIS) Manager.
  2. В просмотре дерева на левой стороне найдите ваше приложение.
  3. Выберите пункт меню Output Caching (Кэширование вывода).
  4. В правой колонке нажмите на Add (Добавить) в меню Action (Действия). В этом месте можно добавить правило кэширования вывода.
  5. В поле File name extension (Расширение имени файла) напечатайте например, php, а затем выберите User-modecaching (Кэширование в пользовательском режиме).
  6. Нажмите на Advanced, а затем установите флажок рядом с Query string variable(s).
  7. Введите соответствующую переменную (переменные) в текстовое поле Query string variable(s).

    Рисунок 1: Пример кэширования вывода

Настройка кэширования вывода с помощью файла Web.config

Можно также настроить функцию кэширования в локальный файл Web.config, который находится в каталоге контента. Ниже приведен пример конфигурации, необходимой для страницы ShowStockPrice.asp с параметром varyByQueryString параметра * (значения кэша всех уникальных вариаций параметров строки запроса) и интервалом в 1 секунду.

<configuration> 

     <location path="showStockPrice.asp">     

       <system.webserver>        

         <caching>         

           <profiles>

             <add varybyquerystring="*"location="Any"

               duration="00:00:01" policy="CacheForTimePeriod"            

               extension=".asp">

           </profiles>

         </caching>

       </system.webserver>

     </location>

</configuration>

При желании кэширования этих данных в ядро для более быстрого выполнения нужно просто изменить атрибут политики на kernelCachePolicy.

Примечание: Microsoft ASP.NET уже включает в себя функцию кэширования вывода, данная функция IIS работает параллельно с кэш-памятью ASP.NET и действует для всех типов приложений.

Проверка счётчиков

Для уточнения производительности в выходном кэше посмотрите на счётчик кэширования вывода на мониторе надёжности и производительности.

  1. Из меню Start (Пуск) нажмите на Administrative Tools (Инструменты администрирования), а затем нажмите на Reliability and Performance Monitor (Монитор надёжности и производительности).  (В Windows Vista® или Windows® 7 инструменты администрирования находятся на панели управления.)
  2. Выберите Performance Monitor (Монитор производительности) в просмотре дерева на правой стороне и нажмите на большой знак "+" на панели управления.
  3. Перейдите на счётчик Web Service Cache (Кэш веб-сервиса) и нажмите на него, чтобы выполнить открытие.
  4. Добавьте счётчик Total URIs Cached (Общее количество кэшированных URI).

При запуске тестирования производительности можно увидеть, что число кэшированных URI увеличивается с количеством запрашиваемых пунктов.

Использование кэширования в режиме ядра

Кэширование вывода IIS 7 поддерживает две политики кэширования:

  • Политика кэширования вывода в пользовательском режиме, которая использует кэш-память, находящуюся в рабочем процессе IIS 7.
  • Политика кэширования в режиме ядра, которая использует кэш-память, находящуюся в Http.sys, драйвере в режиме ядра. Кэширование контента в режиме ядра позволяет выполнить быстродействие веб-сайта. Пример использования кэширования в режиме ядра можно посмотреть в статье IIS 7.0 Output Caching.”

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

  • Кэширование вывода в режиме ядра не поддерживает модули и функции, которые должны работать в пользовательском режиме, такие как проверка подлинности и авторизация. Например, при включенных схемах проверки подлинности, таких как основная проверка или аутентификация Windows, политика кэширования не работает. Контент обслуживается, но не кэшируется. Более подробную информацию о том, почему ответ нельзя кэшировать в режиме ядра, можно получить по ссылке Knowledge Base article
  • Кэширование вывода в режиме ядра поддерживает атрибут varyByHeaders , но не varyByQuerystring.

Поиск сбоя в кэшировании

Failed Request Event Buffering (FREB) является лучшим способом выяснить, действительно ли запрос кэширован. Можно также узнать, почему запрос не кэшируется. Например, событие HTTPSYS_CACHEABLE в журнале регистрации FREB может сообщить, что запрос не получает кэширования, так как в режиме ядра кэширование не выполняется.

Используйте следующую команду для определения, какой контент кэшируется в режиме ядра:

netsh http show cachestate

Кэширование наиболее популярных страниц

Существует возможность настроить кэширование вывода только страниц по умолчанию (наиболее часто запрашиваемые страницы):

  1. Создайте файл с именем default.aspx в каталоге %ystemdrive%\inetpub\wwwroot\<your application>  и добавьте следующий код:  

    <%=DateTime.Now%>

  2. Из меню Start (Пуск) нажмите на Administrative Tools (Инструменты администрирования), а затем нажмите на Internet Information Services (IIS) Manager.
  3. Используйте просмотр дерева на левой стороне для перехода к приложению.
  4. Нажмите на Content View (Просмотреть контент) в верхней части страницы.
  5. Выберите документ по умолчанию (например, страницу Default.aspx ).
  6. В меню Actions (Действия) справа нажмите на просмотр Switch to feature (Переключить на функцию). Каждая сделанная настройка теперь будет применяться только к документу по умолчанию.
  7. Откройте настройку Output Caching Rules (Процедура кэширования вывода).
  8. Добавьте .aspx в качестве расширения файла.
  9. Выберите Kernel-mode caching (Кэширование в режиме ядра), выберите At time intervals (Во временных интервалах), включите Monitor cached files (Монитор кэшированных файлов), а затем напечатайте временной интервал, например, 00:00:30.
  10. Пролистайте https://localhost/<yourapplication> с Windows® Internet Explorer®. При постоянном обновлении страницы (нажмите на Ctrl+F5, чтобы убедиться, что он не из кэша браузера), можно увидеть, что время не изменится в течение 30 секунд.

Примечание: Данная статья написана на основе информации из статьи “IIS7 Output Caching for Dynamic Content - Speed Up Your ASP and PHP Applications” Билла Стейпелса, опубликованной 2 мая 2007г.

Ссылки для дальнейшей информации