Пошаговое руководство. Кэширование выходных данных IIS 7.0
Веб-содержимое можно разделить на две категории: статическое содержимое и динамическое содержимое. Статическое содержимое не изменяется с запроса на запрос. Содержимое, возвращаемое в веб-браузер, всегда одинаково. Примерами статического содержимого являются HTML-файлы, JPG или GIF-файлы.
Другой — динамическое содержимое. Это ответ, который создается для динамических изменений содержимого с каждым запросом. Примеры включают ASP.NET или содержимое PHP.
Существует большой диапазон между этими двумя категориями, которые включают полудинамическую информацию. Представьте себе динамическую ASP.NET страницу, которая выполняет запрос базы данных. Нет причин выполнять этот запрос по каждому запросу, если базовые таблицы базы данных изменяются редко.
Функция кэширования выходных данных IIS предназначена для полудинамичного содержимого. Он позволяет кэшировать статические ответы для динамических запросов и получать огромную масштабируемость.
Необходимые компоненты
Для этого пошагового руководства вам потребуется IIS 7.0 или более поздней версии в Windows® Vista с пакетом обновления 1 (SP1) или windows Server® 2008 Beta 3 или более поздней версии. В этом пошаговом руководстве также используется ASP.NET 2.0, которые необходимо установить в качестве дополнительного компонента в программе установки IIS.
Обзор пошагового руководства
В следующем пошаговом руководстве мы используем интерфейсы расширяемости IIS для добавления сообщений авторских прав на язык в ФАЙЛЫ JPG.
Сначала мы добавим управляемый обработчик. Динамическое вставка сообщения об авторских правах в каждый ФАЙЛ JPG поставляется с затратами, так как теперь управляемый код должен выполняться для каждого ФАЙЛА JPG.
Затем мы устанавливаем WCAT, средство анализа производительности IIS для измерения пропускной способности обработчика авторских прав JPG.
Затем мы добавим кэширование выходных данных, чтобы восстановить снижение производительности, вызванное добавлением обработчика авторских прав.
Часть I. Написание и настройка обработчика авторских прав
Создайте каталог с именем "изображения" в каталоге
%systemroot%\inetpub\wwwroot
. Выполните следующую команду в командной оболочке с повышенными привилегиями:md %systemdrive%\inetpub\wwwroot\pictures
Скопируйте некоторые цифровые рисунки — в этом пошаговом руководстве предполагается, что они должны быть JPG-файлами — в новый каталог рисунков.
Примечание.
Из-за высоких параметров безопасности в Интернете Обозреватель в Windows Server 2008 может появиться диалоговое окно безопасности с сообщением о том, что веб-сайт заблокирован. Чтобы скачать обои IIS, добавьте wallpaper.iis7.org в список доверенных сайтов.
Создайте приложение с помощью средства командной строки appcmd.
%windir%\system32\inetsrv\appcmd add app -site.name:"Default Web Site" -path:/pictures -physicalPath:%systemdrive%\inetpub\wwwroot\pictures
Создайте каталог App_Code под каталогом рисунков:
md %systemdrive%\inetpub\wwwroot\pictures\App_Code
Откройте Блокнот и вставьте в него следующий код.
using System; using System.Web; using System.Drawing; using System.Drawing.Imaging; namespace IIS7Demos { public class imageCopyrightHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { string message = "Copyright © IIS 7.0 Team"; try { string languageHeader; languageHeader = context.Request.Headers["Accept-Language"].Substring(0,2).ToUpper(); switch (languageHeader) { case ("DE"): message = "IIS 7.0 Team - Alle Rechte vorbehalten"; break; case ("ES"): message = "Marca Registrada IIS 7.0 Team"; break; default: break; } } catch { // if something fails, e.g. no Language-Accept header, we go with the english message } InsertCopyrightMessage ( context, message, "yellow" ); } void InsertCopyrightMessage( HttpContext context, string message, string color ) { try { // get physical path of request string strPath = context.Request.PhysicalPath; // load as bitmap Bitmap jpgFile = new Bitmap(strPath); // add copyright message Graphics g = Graphics.FromImage(jpgFile); Font f = new Font("Arial", 20, GraphicsUnit.Pixel); SolidBrush sb = new SolidBrush(Color.FromName(color)); // write copyright message to bitmap g.DrawString( message, f, sb, 5, jpgFile.Height - f.Height - 5 ); f.Dispose(); g.Dispose(); // save it to response stream jpgFile.Save( context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg ); jpgFile.Dispose(); } catch (Exception e) { context.Response.Write(e.Message); } } public bool IsReusable { get { return true; } } } }
Сохраните файл как
%systemdrive%\inetpub\wwwroot\pictures\App\_Code\imageCopyrightHandler.cs
.Создайте обработчик, который выполняет этот код при запросе ФАЙЛА JPG:
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /+[name='imageCopyrightHandler-Integrated',path='*.jpg', verb='GET,HEAD',type='IIS7Demos.imageCopyrightHandler',preCondition='integratedMode']
Мы также должны включить просмотр каталогов, так как еще нет документа по умолчанию:
%windir%\system32\inetsrv\appcmd set config "Default Web Site/pictures" -section:directoryBrowse -enabled:true
Перейдите к приложению изображений, введя в адресную строку Обозреватель Интернет:
http://localhost/pictures
Щелкните ссылку на ФАЙЛ JPG в списке каталогов IIS. Вы увидите изображение JPG с вставленным сообщением об авторских правах.Посмотрите на код. Вы видите, что сообщение об авторских правах зависит от заголовка Accept-Language, который отправляет браузер. Если у вас установлена немецкая версия Microsoft Server 2008, вы увидите сообщение об авторских правах "КОМАНДА IIS 7.0 — Alle Rechte vorbehalten"; Если у вас есть версия испанского языка, вы увидите команду Marca Registrada IIS 7.0. Во всех остальных случаях сообщение об авторских правах будет "Команда © IIS 7.0". Чтобы проверить этот код, можно изменить заголовок Accept-Language Обозреватель отправки в Интернете:
- Откройте "Интернет Обозреватель".
- Откройте меню "Сервис" и нажмите кнопку "Параметры браузера".
- Нажмите кнопку "Языки".
- Нажмите кнопку "Добавить..." кнопка и добавление "es" для испанского или "de" для немецкого языка.
- Переместите новый язык в верхнюю часть списка с помощью кнопки "Переместить вверх".
- Перейдите в
http://localhost/pictures/<your_jpg_file>.jpg
. Сообщение об авторских правах изменилось на настроенный язык. - Не забудьте вернуться в диалоговое окно "Языки" и сбросить - в противном случае вы можете задаться вопросом позже, почему вы получите испанские или немецкие веб-страницы.
Часть II. Тест производительности imageCopyrightHandler
После работы обработчика авторских прав JPG необходимо определить, насколько быстро работает наш код. Установите средство набора ресурсов IIS 6.0 для выполнения тестов производительности:
Скачайте средства набора ресурсов IIS 6.0 и установите их. Выполните настраиваемую установку и установку только средства анализа веб-емкости (WCAT). WCAT — это единственная функция средств набора ресурсов IIS 6.0, которые необходимо выполнить наши тесты производительности.
Примечание.
Из-за высоких параметров безопасности в Интернете Обозреватель в Windows Server 2008 может появиться диалоговое окно безопасности с сообщением о том, что веб-сайт заблокирован. Чтобы скачать пакет ресурсов IIS 6.0, добавьте *.microsoft.com в список доверенных сайтов.
Создайте каталог с именем PERFTEST, например:
md %systemdrive%\perftest
Для контроллера WCAT требуется три входных файла:
- Файл скрипта, указывающий WCAT, какие URL-адреса запрашивать. Каждый URL-адрес получает уникальный идентификатор класса
- Файл распространения, указывающий WCAT, как запросы должны распределяться по URL-адресам, указанным в файле скрипта.
- Файл конфигурации, который настраивает параметры определенного запуска производительности, например длительность тестов, количество http-клиентов для имитации и т. д.
Файл скрипта
Создайте файл script.cfg в каталоге perftest и вставьте в него следующее содержимое:
NEW TRANSACTION classId = 1 NEW REQUEST HTTP Verb = "GET" URL = "http://localhost/pictures/<your image name>.JPG" NEW TRANSACTION classId = 2 NEW REQUEST HTTP Verb = "GET" URL = "http://localhost/pictures/<your image name>.JPG"
Примечание.
Замените <запись имени> изображения именами ФАЙЛОВ JPG. Если у вас есть файлы JPG, можно добавить новую транзакцию. Убедитесь, что каждая транзакция предоставляет новый идентификатор класса.
Файл распространения
Файл распространения сообщает WCAT, как он должен весить запросы. С двумя приведенными выше URL-адресами мы делаем даже 50/50 рассылки. Каждый классИД запрашивается 50 % времени.
Создайте файл, который вызывается
%systemdrive%\perftest\distribution.cfg
в каталоге perftest, и вставьте в него следующее содержимое:1 50 2 50
Файл конфигурации
Ниже приведены рекомендуемые параметры для теста:
- Длительность: 30 секунд
- Прогреть: 5 секунд
- Прохлада: 5 секунд
- Имитированные http-клиенты: 20
Создайте файл с именем config.cfg в каталоге perftest и вставьте в него следующее содержимое:
Warmuptime 5s Duration 30s CooldownTime 5s NumClientMachines 1 NumClientThreads 20
Запустите контроллер, выполнив следующие команды:
Cd \perftest "%programfiles%\IIS Resources\WCAT Controller\wcctl" -c config.cfg -s script.cfg -d distribution.cfg -a localhost
Как только все клиенты подключены, будет запущен тест perf.
Так как у нас есть только один клиент, откройте другую командную оболочку с повышенными привилегиями и выполните следующую команду:
"%programfiles%\IIS Resources\WCAT Client\wcclient.exe" localhost
Чтобы сделать это с большим количеством клиентов, задайте NumClientMachines в config.cfg более высокое число и подключите клиенты к контроллеру с помощью команды wcclient, указав имя компьютера контроллера.
Пример: wcclient MyPerfTestControllerMachine
Примечание.
Если это сделать в 64-разрядной версии Windows, WCAT устанавливается в каталог "program files (x86)" и необходимо использовать для
%programfiles(x86)%
запуска WCAT.Ниже приведены результаты первого запуска:
######################################################################## WCAT Performance Statistics_________________________________ Server : localhost () #Transactions : 3 (HTTP/1.1) Total Async Sockets : 20 (5 WCAT Pool Threads) Total Elapsed Time : 30 Secs (0 Hrs,0 Mins,30 Secs) Current Connections : 20 Total Connection Attempts : 436 ( 14/Sec) Total Connect Errors : 0 ( 0/Sec) Total Success Connections : 436 ( 14/Sec) Total Consec. Connect Errors: 0 ( 0/Sec) Total Bytes : 32301100 ( 1051 KB/Sec) Total Bytes Written : 32264 ( 1 KB/Sec) Total Bytes Read : 32268836 ( 1050 KB/Sec) Total Requests : 436 ( 14/Sec) Total Responses : 436 ( 14/Sec) Total Socket Reads : 6976 ( 232/Sec) Total Socket Writes : 436 ( 14/Sec) Total Parse Errors : 0 ( 0/Sec) Total Socket Errors : 0 ( 0/Sec) Total I/O Errors : 0 ( 0/Sec) Total Internal Errors : 0 ( 0/Sec) Total Time Outs : 0 ( 0/Sec) Total 200 OK : 436 ( 14/Sec) Total 30X Redirect : 0 ( 0/Sec) Total 304 Not Modified : 0 ( 0/Sec) Total 404 Not Found : 0 ( 0/Sec) Total 500 Server Error : 0 ( 0/Sec) Total Bad Status : 0 ( 0/Sec) Min. Connect Time : 0 MS Avg. Connect Time : 0 MS Max. Connect Time : 16 MS Min. Resp Time (1st Byte) : 1281 MS Avg. Resp Time (1st Byte) : 1371 MS Max. Resp Time (1st Byte) : 1578 MS Min. Response Time (Last) : 1281 MS Avg. Response Time (Last) : 1373 MS Max. Response Time (Last) : 1578 MS Current Outstanding Connects: 0 ( 20 Max) Current Waitable Connects : 0 ( 20 Max) Total Asynchronous Connects : 531 ( 1/Sec) Total Discarded Connects : 0 ( 0/Sec) ########################################################################
Важное число для просмотра — это запросы в секунду. В этом случае мы получаем 14 запросов в секунду.
Слово предостережения — чем больше файлы JPG, тем меньше запросов вы увидите. Скорее всего, компьютер связан с сетью: службы IIS не смогут обрабатывать больше запросов, так как сеть перегружена данными, которые вы отправляете. Вы увидите лучшие результаты с файлами JPG в диапазоне КБ 200-300.
Добавление кэширования выходных данных
Код для динамической вставки сообщения об авторских правах довольно медленный. 10 запросов в секунду не выполняются быстро для веб-сервера. Службы IIS выполняют гораздо лучше. Все, что необходимо сделать, — создать политику кэширования, которая помещает URL-адреса с расширением JPG в кэш режима ядра. Вот как добавить политику кэша:
Добавление политики кэша с помощью средства управления IIS
- Перейдите к разделу "Администратор istrative Tools" и выберите "Диспетчер службы IIS (IIS).
- Используйте представление дерева слева, чтобы перейти к приложению "изображения".
- Выберите пункт меню "Правила кэширования выходных данных".
- Нажмите кнопку "Добавить..." в меню "Действия".
- Добавьте JPG в кэш в качестве расширения файла.
- Выберите "Интервалы времени" в разделе "Мониторинг кэшированных файлов" и введите 00:00:10 в качестве интервала времени.
- Установите флажок "Заголовки" проверка-поле и введите "Accept-Language".
Примечание.
Пользовательский интерфейс кэша выходных данных недоступен в версиях до windows Vista с пакетом обновления 1 (SP1).
Добавление политики кэша с помощью командной строки
Чтобы выполнить ту же процедуру с инструментом appcmd, введите следующую команду:
%windir%\system32\inetsrv\appcmd set config "Default Web Site/pictures"
-section:caching /+profiles.[extension='.jpg',duration='00:00:10',
policy='CacheForTimePeriod',varyByHeaders='Accept-Language']
Повторите выполнение производительности, чтобы узнать, что и как изменяются параметры конфигурации.
Запустите контроллер, выполнив следующие команды:
Cd \perftest "%programfiles%\IIS Resources\WCAT Controller\wcctl" -c config.cfg -s script.cfg -d distribution.cfg -a localhost
Запустите клиент со следующими параметрами:
"%programfiles%\IIS Resources\WCAT Client\wcclient.exe" localhost
Примечание.
Если это сделать в 64-разрядной версии Windows, WCAT устанавливается в
program files (x86)
каталоге и необходимо использовать%programfiles(x86)%
для запуска WCAT.
Образец вывода
########################################################################
WCAT Performance Statistics_________________________________
Server : localhost ()
#Transactions : 3 (HTTP/1.1)
Total Async Sockets : 20 (5 WCAT Pool Threads)
Total Elapsed Time : 30 Secs (0 Hrs,0 Mins,30 Secs)
Current Connections : 19
Total Connection Attempts : 13020 ( 434/Sec)
Total Connect Errors : 0 ( 0/Sec)
Total Success Connections : 13019 ( 433/Sec)
Total Consec. Connect Errors: 0 ( 0/Sec)
Total Bytes : 958045737 (31186 KB/Sec)
Total Bytes Written : 963406 ( 31 KB/Sec)
Total Bytes Read : 957082331 (31155 KB/Sec)
Total Requests : 13019 ( 433/Sec)
Total Responses : 13019 ( 433/Sec)
Total Socket Reads : 258283 ( 8609/Sec)
Total Socket Writes : 13019 ( 433/Sec)
Total Parse Errors : 0 ( 0/Sec)
Total Socket Errors : 0 ( 0/Sec)
Total I/O Errors : 0 ( 0/Sec)
Total Internal Errors : 0 ( 0/Sec)
Total Time Outs : 0 ( 0/Sec)
Total 200 OK : 13019 ( 433/Sec)
Total 30X Redirect : 0 ( 0/Sec)
Total 304 Not Modified : 0 ( 0/Sec)
Total 404 Not Found : 0 ( 0/Sec)
Total 500 Server Error : 0 ( 0/Sec)
Total Bad Status : 0 ( 0/Sec)
Min. Connect Time : 0 MS
Avg. Connect Time : 0 MS
Max. Connect Time : 63 MS
Min. Resp Time (1st Byte) : 0 MS
Avg. Resp Time (1st Byte) : 33 MS
Max. Resp Time (1st Byte) : 125 MS
Min. Response Time (Last) : 0 MS
Avg. Response Time (Last) : 45 MS
Max. Response Time (Last) : 141 MS
Current Outstanding Connects: 0 ( 20 Max)
Current Waitable Connects : 0 ( 20 Max)
Total Asynchronous Connects : 14093 ( 147/Sec)
Total Discarded Connects : 0 ( 0/Sec)
########################################################################
Дополнительные разделы кэширования выходных данных
Счетчики производительности
Чтобы определить производительность в выходном кэше, просмотрите счетчики кэша выходных данных в разделе "Надежность и Монитор производительности". Есть много интересных счетчиков. Ниже приведен один из примеров использования компонента "Надежность и Монитор производительности" вместе с кэшем выходных данных.
- В Windows Server 2008 запустите PERFMON через меню . Перейдите к разделу "Администратор istrative Tools" (Средства Администратор istrative Tools) и щелкните "Надежность и Монитор производительности". В Vista вы найдете "Администратор istrative Tools" в панель управления.
- Выберите "Монитор производительности" в представлении дерева справа и щелкните большой вход "+" на панели инструментов.
- Перейдите к счетчику "Кэш веб-службы" и щелкните его, чтобы открыть его.
- Добавьте счетчик "Total URIs Cached".
- Повторно запустите тест WCAT.
Вы видите, что количество кэшированных URI увеличивается в зависимости от количества элементов, которые вы запрашиваете во время теста производительности.
Правила кэширования в режиме ядра IIS
Кэш выходных данных IIS поддерживает две политики кэша. Политика регулярного кэша выходных данных использует кэш, который находится в рабочем процессе IIS. Другая политика кэша — это политика кэша в режиме ядра, в этом случае кэш находится в HTTP.SYS драйвер режима ядра.
Кэширование содержимого в режиме ядра позволяет веб-сайту быстрее работать. Измените конфигурацию приложения изображений, чтобы использовать кэш режима ядра. Вот как выглядит текущая конфигурация (%systemdrive%\inetpub\wwwroot\pictures\web.config
):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<directoryBrowse enabled="true" />
<caching>
<profiles>
<add extension=".jpg" policy="CacheForTimePeriod"
duration="00:00:10" varyByHeaders="Accept-Language" />
</profiles>
</caching>
</system.webServer>
</configuration>
Теперь измените его, чтобы использовать кэширование в режиме ядра:
Открыть
%systemdrive%\inetpub\wwwroot\pictures\web.config
.Измените параметр.
<caching> <profiles> <add extension=".jpg" policy="CacheForTimePeriod" duration="00:00:10" varyByHeaders="Accept-Language" /> </profiles> </caching>
на следующие:
<caching> <profiles> <add extension=".jpg" kernelCachePolicy="CacheForTimePeriod" duration="00:00:10" /> </profiles> </caching>
Вы видите, что атрибут varyByHeaders больше не используется. Это связано с тем, что ядроModeCache не поддерживает некоторые функции, поддерживаемые кэшем выходных данных в режиме пользователя.
Ограничения кэша выходных данных режима ядра
Существует два существенных различия между режимом пользователя и кэшом выходных данных в режиме ядра.
- Кэш выходных данных в режиме ядра не поддерживает модули и функции, которые должны выполняться в пользовательском режиме, например аутентификации или авторизации. Пример. Если включены такие схемы проверки подлинности, как Базовый или проверка подлинности Windows, политика кэша не будет работать. Содержимое обслуживается, но не кэшируется. См. раздел "Устранение неполадок кэширования" о том, как узнать, кэшируются ли содержимое. Дополнительные сведения о том, почему ответы могут не кэшироваться в режиме ядра, приведены в этой статье базы знаний.
- Кэш выходных данных режима ядра поддерживает атрибут varyByHeaders, но не отличаетсяByQuerystring.
Устранение неполадок с кэшированием
Буферизация событий неудачного запроса (FREB) — лучший способ выяснить, будет ли ваш запрос кэширован. FREB сообщает, почему что-то не кэшировано. Ниже приведен пример журнала FREB. В этом случае событие HTTPSYS_CACHEABLE сообщает, что запрос не кэшируется, так как кэш в режиме ядра не включен.
Дополнительные сведения о работе с FREB см. в разделе "Устранение неполадок неудачных запросов с помощью трассировки" в IIS 7.
Используйте следующую команду, чтобы узнать, какое содержимое кэшируется в режиме ядра:
netsh http show cachestate
Кэширование intricacies
Даже если включить кэширование выходных данных, службы IIS не сразу кэшируют запрос. Он должен запрашиваться несколько раз, прежде чем IIS рассматривает запрос, который будет "достойным кэша". Готовность к кэшу можно настроить с помощью раздела ServerRuntime, описанного в этой статье MSDN.
Два свойства, определяющие производительность кэша, являются частыми и часто задаваемыми значениямиHitTimePeriod и frequentHitThreshold. Запрос кэшируется только в том случае, если больше <frequentHitThreshold>
запросов на кэшируемый URL-адрес поступает в частое <времяHitTimePeriod>.
Значение по умолчанию для frequentHitTimePeriod — 10 секунд.
Значение по умолчанию для frequentHitThreshold равно 2.
Кэширование наиболее популярных страниц
В приведенном выше примере мы помещаем все файлы с расширением JPG в выходной кэш. Это не всегда работает, так как иногда требуется быть более выборочным и помещать только определенный документ в выходной кэш. Вот как это сделать с наиболее часто запрашиваемой страницей, документом по умолчанию:
Создайте файл с именем default.aspx в каталоге
%systemdrive%\inetpub\wwwroot\pictures
и добавьте следующий код:<%=DateTime.Now%>
Перейдите к разделу "Администратор istrative Tools" и выберите "Диспетчер службы IIS (IIS).
Используйте представление дерева слева, чтобы перейти к приложению "изображения".
Щелкните "Представление содержимого" в нижней части страницы.
Выберите документ по умолчанию, например страницу default.aspx.
В меню "Действия" справа щелкните "Переключиться на представление функций". Все настроенные параметры будут применяться только к документу по умолчанию.
Откройте параметр "Правила кэширования выходных данных".
Добавьте ".aspx" в виде расширения файла.
Выберите "Кэширование в режиме ядра", затем мы можем выбрать "Через интервалы времени" и включить "Мониторинг кэшированных файлов" и ввести 00:00:30 в качестве интервала времени.
Перейдите к параметру
http://localhost/pictures
"Интернет Обозреватель". Постоянно обновляя страницу (нажимайте клавиши CTRL+F5, чтобы убедиться, что она не будет поступать из кэша браузера), вы увидите, что время не изменится в течение 30 секунд.
Итоги
Использование функции кэша выходных данных IIS для полудинамичного содержимого может улучшить веб-сайт. Вы видите существенное улучшение производительности и пропускной способности. Простое изменение конфигурации достаточно, чтобы воспользоваться этой функцией.