Всякий раз, когда я встречаюсь с представителями
компаний, планирующих переход на IIS 7.0, мне задают один и тот же вопрос:
увеличится ли производительность серверов и приложений в результате этого
перехода? В общем, производительность должна
возрасти; но не удивляйтесь, если сразу после переноса приложений на IIS
7.0 этого не произойдет.
Чтобы понять причину этого
явления, необходимо сначала разобраться с сутью последнего выпуска IIS.
Версия IIS 6.0 содержала существенные технологические изменения,
направленные на достижение трех целей: повышение уровня безопасности,
увеличение надежности и улучшение производительности. Выпуск версии IIS
7.0 преследовал совершенно иную цель: на основе высокопроизводительного
кода базовых компонентов веб-сервера, написанного для версии 6.0, создать
модульную и расширяемую платформу, которая поддерживала бы основные
сценарии развертывания веб-приложений и управления ими.
Многие архитектурные изменения и
новые функции этой версии могут отрицательно воздействовать на
производительность веб-сервера. Например, одним из основных изменений
стало разделение компактных и оптимизированных ветвей кода веб-сервера на
изолированные модули, которые не подвергаются никакой специальной
обработке со стороны веб-сервера. Однако в результате огромной работы по
улучшению производительности, выполненной группой разработки IIS, его
производительность осталась примерно такой же, как и у его
предшественника, а в некоторых случаях даже повысилась. Как разработчик
основных компонентов веб-сервера и интегрированного конвейера я могу
сказать, что такой результат был достигнут в результате искусного
проектирования и кропотливой работы над созданием продукта.
Тем не менее, у IIS 7.0 есть
намного большие возможности по значительному приросту скорости работы и
снижению затрат, связанных с производительностью фермы серверов, чем любая
другая предыдущая версия IIS.
Скорее всего, просто переход на
IIS 7.0 не выявит всех преимуществ нового веб-сервера, хотя в некоторых
случаях и этого будет достаточно. Например, на узле Microsoft.com было
отмечено 10-процентное улучшение эффективности использования ЦП (полный
анализ доступен в блоге группы разработки Microsoft.com наgo.microsoft.com/fwlink/?LinkId=122497).
Кроме того, в некоторых определенных областях может наблюдаться
существенный рост производительности, в частности в работе протокола SSL и
проверки подлинности Windows® (оба процесса теперь
выполняются на уровне ядра), а также улучшение вертикальной
масштабируемости на многопроцессорных и многоядерных машинах.
Однако основная мощность IIS 7.0
состоит не в пошаговом улучшении производительности существующих функций.
Напротив, главные усовершенствования заключаются в новых возможностях,
которые нужно активно использовать. Эти возможности основываются на
гибкости и расширяемости новой платформы, а также на новых функциях
повышения производительности. В этой статье я расскажу вам о 10 наиболее
важных способах улучшения производительности, которые станут вам доступны
после перехода на IIS 7.0.
Экономичные веб-серверы
Возможность развертывать
экономичные серверы IIS 7.0 обеспечивается их модульной архитектурой.
Практически все функции веб-сервера реализованы в виде модульных
компонент, которые можно добавлять и удалять независимо друг от друга.
Таким образом можно убрать все ненужные для приложения операции, что
приведет к существенному уменьшению области, открытой для атак и ресурса,
используемого операциями, а также к улучшению производительности.
Полный набор функций веб-сервера
IIS 7.0 состоит из 44 модулей, включая собственные модули IIS и ASP.NET,
предоставляющие службы для интегрированного конвейера. В модулях
реализованы такие функции, как проверка подлинности (модули проверки
подлинности Windows и дайджест-проверки подлинности), поддержка
инфраструктуры приложения (модуль FastCGI), службы приложений (модуль
состояния сеанса), обеспечение безопасности (модуль фильтрации запросов) и
производительности (модуль кэширования выходных данных). Однако
минимальному веб-серверу, обслуживающему статические страницы, для работы
требуется всего 2 модуля!
Количество дополнительные данных
от неиспользуемых модулей может быть довольно значительным — например, от
модуля записи запросов в журнал или от модуля трассировки неудачно
завершившихся запросов. Если удалить эти модули из окружения, где они не
нужны, можно получить прирост общей пропускной способности и уменьшение
времени реакции сервера, что в свою очередь улучшит такие характеристики
нагрузки на сервер, как время до получения первого байта (TTFB) и время до
получения последнего байта (TTLB).
На рис. 1
показаны результаты простых тестов пропускной способности для HTML-файла
(статическая нагрузка) и страницы «Здравствуй, мир», написанной на ASP.NET
(нагрузка ASP.NET). Использовались три конфигурации веб-сервера: с полным
набором функций, с предлагаемым по умолчанию набором функций для каждого
типа нагрузки и с минимальным набором необходимых для каждого типа
нагрузки функций. Можно заметить, что, хотя большинство необязательных
функций отключены даже в полной конфигурации сервера, пропускную
способность можно существенно увеличить как в случае статической нагрузки,
так и при работе ASP.NET, если полностью удалить ненужные функции.
Рис. 1. Пропускная способность
сервера при статической нагрузке и работе с ASP.NET в трех разных
конфигурациях со 100 параллельно подключенными клиентами
Кроме того, может снизиться
объем занимаемой памяти и повыситься плотность веб-узлов, особенно в
случае сред совместного размещения или при использования большого
количества рабочих процессов. Это происходит за счет уменьшения количества
библиотек DLL, загружаемых каждым процессом, а также количества запросов
на выделение памяти, происходящих при инициализации модуля и обработке
запроса. На рис. 2 изображено использование памяти (в
байтах исключительного использования рабочими процессами IIS) в тестах
пропускной способности, о которых говорилось выше. И, хотя приведенные в
этом примере изменения не так заметны, они, тем не менее, соответствуют
всем ожиданиям. Дело в том, что поддержка приложений ASP.NET требует
больше служебных данных, чем можно высвободить удалением модулей.
Рис. 2 Использование памяти (в
байтах исключительного использования рабочими процессами IIS) сервером при
статической нагрузке и работе с ASP.NET в трех разных конфигурациях со 100
параллельно подключенными клиентами
При помощи наборов необходимых
условий IIS 7.0 также предоставляет дополнительные возможности по
управлению тем, какие модули будут включены на уровне приложения, а также
по использованию модулей в зависимости от рабочей нагрузки на них. Хотя
для этого и потребуется профессиональная настройка веб-сервера,
многоузловые серверы или приложения с несколькими видами рабочей нагрузки
могут получить значительные дополнительные преимущества.
В качестве предупреждения:
определение требующегося набора функций — непростая задача. Необходимо
принять во внимание не только минимальные возможности, требующиеся для
работы приложений, но и любые дополнительные функции, которые могут неявно
использоваться приложением. Например, приложение может зависеть от
собственных методов проверки подлинности пользователя, а может полагаться
на средства авторизации, предоставляемые различными возможностями IIS. В
последнем случае удаление этих функций может снизить уровень безопасности
приложения. Подобным образом приложение может опираться на некоторые
технически необходимые или повышающие производительность функции. В этом
случае удаление модуля с этими функциями может повлечь за собой неверную
работу приложения или снижение его производительности.
Использование экономичной
операционной системы
В Windows Server® 2008 реализовано выделение компонентов на уровне
операционной системы, посредством чего можно дополнительно сократить
контактную зону веб-сервера. Минимальным режимом установки Windows Server
2008 является режим «Server Core», который содержит минимальный набор
основных подсистем операционной системы. Для экономичных веб-серверов на
базе IIS 7.0 лучшим вариантом установки является именно Server Core.
Однако, рассматривая возможности
Server Core, необходимо учитывать, какие его ограничения могут отразиться
на работе вашего приложения. В Server Core отсуствует поддержка платформы
Microsoft® .NET Framework, то есть нет ASP.NET,
расширений.NET для IIS и диспетчера служб IIS. Кроме того, решение задач
местного управления потребует использования средств командной строки,
поскольку консоль управления (MMC) также отсутствует. Между приложениями,
работающими под управлением Server Core и полной версией Windows Server,
не будет особых отличий в объеме занимаемой памяти и пропускной
способности приложений, если уже были использованы преимущества
компонентной структуры IIS. Работа, выполняемая IIS и вашими приложениями,
одинакова на обеих платформах. Однако есть характеристика, где разница
будет заметна: место, занимаемое сервером, как на жестком диске, так и в
оперативной памяти.
В качестве примера на
рис. 3 показана разница в занимаемом объеме после
одинаковой статической рабочей нагрузки на серверы, работающие под
управлением Windows Server 2008 в полной конфигурации и Server Core. Хотя
IIS занимает в обоих случаях почти одинаковое место, общий объем места,
занимаемого операционной системой Server Core меньше, что позволяет
поддерживать ту же рабочую нагрузку, используя существенно меньший объем
памяти. Из-за меньшего размер установки может появиться возможность
использовать менее мощное аппаратное обеспечение для работы приложения.
При этом основная мощность процессора будет тратиться на обработку
запросов приложения, а не операционной системы, что делает Server Core
отличным вариантом для виртуализированных сред.
Рис. 3. Память, занимаемая
Windows Server 2008 в полной конфигурации и Server Core после выполнения
теста на статическую нагрузку
Применение топологий,
адаптированных для нужд приложения
Оптимизируя нагрузку на
приложение, в ней можно выделить отдельные части. Например, вместо 30
одинаковых веб-серверов можно обойтись 10 веб-серверами, 3 серверами
приложений и 3 прокси-серверами, последние из которых будут выполняли бы
кэширование и сжатие данных.
Такая специализация работает по
нескольким причинам. Во-первых, производительность многих приложений
сильно зависит от разных ресурсов, используемых совместно, таких как
память. Части одного и того же приложения могут конкурировать за доступ к
таким ресурсам. Такая конкуренция может приводить к образованию узких
места и, а это, в свою очередь, будет мешать всем серверам воспользоваться
ресурсом. Выделение разных частей приложения позволяет предоставить им
доступ к ресурсам, за которые в другом была бы возможна конкуренция, таким
образом повышая эффективность их использования.
Во-вторых, специализация может
привести к тому, что приложение будет лучше размещено в кэше, что увеличит
его производительность. Это относится к кэшам низкого уровня, таким как
аппаратный буфер TLB виртуальной памяти, кэш файловой системы, а также
другие средства кэширования, реализуемые как операционной системой, так и
приложением. Другим источником хорошего местоположения является ЦП.
Уменьшение числа одновременно выполняемых операций путем уделения
основного внимания только определенной части приложения позволяет
уменьшить количество переключений контекста максимально увеличить объем
работы, выполняемой ЦП.
В-третьих, специализация
обеспечивает возможность оптимизации рабочих нагрузок, повышая
эффективность работы всех частей приложения. Множество из этих оптимизаций
невозможны при поддержке всего приложения на одном сервере из-за
противоречия потребностей различных частей приложения.
Это возможно только в
конфигурации потоков IIS и ASP.NET, которая существенно влияет параллелизм
и косвенно сказывается на использовании памяти, задержке и пропускной
способности множества приложений. Рабочая нагрузка статического файла IIS
крайне асинхронна и требует максимального уровня одновременных запросов,
но использует очень небольшое количество доступных потоков. С другой
стороны, многие функции ASP.NET синхронны, отличаются длительной
блокировкой и требуют большого количества потоков, тогда как для других
функций требуется более низкий предел параллелизма для снижения
воздействия на память. Путем выделения статической нагрузки и поврежденных
частей конвейера обработки процессов в отдельный процесс или сервер можно
оптимизировать параллелизм каждой отдельной нагрузки.
Наконец, специализация может
повысить уровень общей масштабируемости, позволяя приложению выполнять
масштабирование отдельных нагрузок или частей приложения независимо друг
от друга. Это позволяет топологии приложения увеличивать
производительность и избыточность там, где это необходимо, вместо
необходимости применения одного шаблона ко всему приложению. В этой модели
специализированными ресурсами могут быть физические серверы, виртуальные
серверы или даже пулы приложений на одном компьютере.
Оценку возможных преимуществ
специализации в топологии приложения необходимо начать с поиска обработки
или ограничений приложения, требующих существенных затрат ресурсов. Эти
области должны быть первыми кандидатами на специализацию, поскольку при
изоляции они могут обеспечить значительные возможности для оптимизации, а
также потому, что для них потребуется наибольшее горизонтальное
масштабирование. Затем необходимо оценить, позволит ли изоляция более
эффективно использовать ресурсы остальным частям приложения. Наконец,
потребуется оценить перегрузку механизма подключения, необходимую для
объединения изолированных компонентов приложения.
Улучшенная поддержка
приложения
Службы IIS 7.0 включают в себя
расширенную поддержку платформ приложений с помощью FastCGI, открытого
протокола, поддерживаемого множеством платформ приложений с открытым
исходным кодом, которые в противном случае могут не поддерживать надежную
и высокопроизводительную собственную интеграцию с IIS. В отличие от
протокола CGI, который в течение длительного времени поддерживался IIS,
FastCGI обеспечивает значительно улучшенную производительность на
платформе Windows. В основном это обусловлено архитектурой многократно
используемых процессов FastCGI, уменьшающей значительные затраты на
создание процессов для отдельных запросов, что позволяет клиентам
использовать преимущества постоянных открытых соединений.
При поддержке платформ
приложений в IIS с помощью CGI или другого механизма можно улучшить
производительность (а в некоторых случаях и стабильность) путем перехода
на протокол FastCGI.
Первой платформой приложений,
использующей преимущества этой поддержки, является PHP. Группа
разработчиков IIS фактически напрямую работала с компанией Zend
Technologies для обеспечения успешной работы реализации FastCGI IIS с PHP
и улучшения производительности платформы PHP в Windows. (Более подробные
сведения об этом проекте см. в моем блоге по адресу go.microsoft.com/fwlink/?LinkId=122509.)
При наличии различных технологий веб-серверов, включающих в себя
приложения ASP или ASP.NET, работающие в IIS, и PHP и другие платформы
приложений, совместимые с FastCGI, использующие иные технологии, можно
консолидировать эти приложения на платформе IIS 7.0.
Перенос PHP и других платформ
приложений на IIS 7.0 и FastCGI позволит использовать преимущества
различных функций IIS 7.0, в том числе интегрированный контейнер ASP.NET.
Это предоставляет очень удобный способ улучшения платформ приложений при
помощи служб ASP.NET без их преобразования в ASP.NET. Это также позволяет
совместно работать приложениям, использующим различные платформы. Пример
использования этого для улучшения существующих приложений при помощи
функций и повышения производительности без изменения кода см. в моей
статье «Улучшите приложения при помощи интегрированного конвейера ASP.NET»
в журнале MSDN® Magazine (доступна по адресу msdn.microsoft.com/magazine/cc135973.aspx).
Увеличенная плотность
приложений
IIS 7.0 включает множество
улучшений, предназначенных для увеличения плотности приложений, которые
могут быть размещены на одном сервере. Эти улучшения являются некоторыми
из множества функций IIS 7.0, направленных на улучшение качества
совместного размещения, которые включают улучшенную подготовку узлов и
лучшую изоляцию приложений.
С точки зрения
производительности улучшения главным образом касаются двух аспектов
увеличения плотности приложений — увеличение количества приложений,
которые могут быть подготовлены на сервере IIS 7.0, и количества
приложений, которые могут быть активны в любое заданное время.
Обратите внимание на то, что
службы IIS 7.0 теперь позволяют подготавливать на каждом сервере больше
приложений, чем раньше — в нескольких внутренних тестах достигалась цифра
в 100 000 узлов на одном сервере. Это обеспечивает возможность создания и
настройки большого числа узлов и приложений.
В качестве предупреждения: для
достижения высокоскоростной подготовки необходимо перейти на новые API
настройки, поскольку старые API настройки не позволяют этого. Кроме того,
не все API настройки IIS предоставляют одинаковые характеристики
производительности, поэтому для обеспечения максимальной
производительности необходим тщательный выбор API. При возникновении
сомнений используйте параметры конфигурации, которые напрямую используют
новые объекты настройки IIS, включая пространство имен
Microsoft.Web.Administration, служебную программу командной строки
AppCmd.exe и объекты настройки IIS COM, которые можно вызвать из сценария,
кода .NET или C++.
Разница между количеством узлов,
которые могут быть подготовлены и которые могут быть активны – очень
важное отличие архитектуры IIS, постоянно использующей приложения и
рабочие процессы для выполнения обработки запроса. В этой модели активные
приложения потребляют больше ресурсов на сервере, но обеспечивают
постоянную лучшую производительность благодаря кэшированию и отсутствию
затрат на инициализацию.
Поскольку для каждого активного
приложения необходим определенный объем памяти и рабочий процесс (при
использовании рекомендуемой модели изоляции приложений), количество
активных приложений сильно зависит от объема памяти приложения. Поэтому
хотя для рабочего процесса одного приложения, выполняющего только
обслуживание статического содержимого, требуется всего 3 МБ (подобные
приложения часто могут использовать рабочий процесс совместно с другими
приложениями, работающими со статическим содержим), для некоторых
динамических приложений может требоваться 100 МБ ОЗУ или больше даже при
низкой загрузке. Это обуславливает незначительную загрузку памяти самим
рабочим процессом IIS по сравнению с местом, которое занимает приложение,
при определении максимальной возможной плотности.
В типичном сценарии совместного
размещения часто можно увидеть так называемое распределение 80/20, когда
80 процентов запросов выполняются к 20 процентам узлов. Результат –
небольшой процент активных узлов в любой определенный момент времени. Для
обеспечения большего количества активных узлов службы IIS 7.0
предоставляют активное управление временем существования. Это помогает
высвободить память неактивных приложений, чтобы можно было разместить
большее количество активных приложений.
В IS 7.0 появился новый алгоритм
под названием «динамический простой», заблаговременно регулирующий
тайм-ауты простоя рабочих процессов на основе доступной на сервере памяти.
При нехватке памяти простаивающие приложения удаляются более быстро, что
обеспечивает размещение большего количества приложений. Однако при наличии
доступной памяти тайм-ауты могут оставаться большими для обеспечения
лучшей производительности и поддержания состояния приложения. Помимо
большего количества приложений, которые могут быть активными, динамический
простой позволяет избежать условий нехватки памяти, вызывающих
существенное снижение производительности сервера из-за пробуксовки.
Для обеспечения возможности
размещения множества активных приложений также следует использовать
преимущества 64-разрядной операционной системы, заключающиеся в
возможности использования более 4 ГБ ОЗУ. На основе этого можно настроить
рабочие процессы IIS для работы в 32-разрядном режиме (SysWoW64), в
котором они используют меньше памяти, одновременно позволяя операционной
системе работать с большим объемом памяти, чем возможно в 32-разрядной
среде.
Сокращение занимаемой полосы
пропускания за счет сжатия данных
Неудивительно, что затраты на
полосу пропускания – одни из самых больших затрат при работе центра
обработки данных, имеющего выход в Интернет. Кроме того, полоса
пропускания, необходимая для предоставления запрошенного содержимого,
является ключевым фактором воспринимаемой скорости работы вашего
приложения.
Одним из наиболее эффективных
способов уменьшения полосы пропускания, необходимой для доставки ответов
приложения, является использование сжатия HTTP. Оно позволяет значительно
уменьшить размер ответа, часто даже в 10 раз, для просто сжимаемого
содержимого, такого как HTML. Лучше всего то, что сжатие HTTP поддерживают
практически все обозреватели для настольных систем, а затраты на
распаковку на оборудовании настольных систем минимальны по сравнению с
неявной экономией отправки меньшего количества данных. А поскольку сжатие
основано на согласовании кодировки содержимого, определенном в протоколе
HTTP 1.1, включение этой функции безопасно для клиентов, не поддерживающих
сжатие — эти клиенты просто получают несжатую версию содержимого.
Службы IIS 7.0 предоставляет две
функции сжатия, представленные в их предшественнике: статическое сжатие и
динамическое сжатие. Статическое сжатие выполняет предварительное сжатие
статического содержимого и сохраняет его на диск, таким образом, позволяя
будущим запросам работать напрямую со сжатым содержимым без затрат на
сжатие. Динамическое сжатие выполняет сжатие ответов в реальном времени, и
позволяет сжимать созданные приложениями ответы. Все платформы приложений
на IIS 7.0 могут использовать преимущества динамического сжатия, включая
ASP, ASP.NET и PHP.
Несмотря на распространенный
миф, обычно динамическое сжатие не вызывает чрезмерную загрузку ЦП.
Фактически, часто динамическое сжатие использует меньше 5 процентов
ресурсов ЦП загруженного сервера. Динамическое сжатие может использоваться
довольно свободно, обеспечивая максимальную экономию полосы пропускания
для выполняющихся приложений.
Можно дополнительно
оптимизировать загрузку сжатия, настроив уровень сжатия для достижения
необходимого соотношения сжатия и загрузки ЦП. Но на этом все не
заканчивается — также можно настроить приложение для поддержки кэширования
сжатого содержимого, что устраняет загрузку сжатия на попадания в кэше
благодаря работе с уже сжатым содержимым. Имейте в виду, что в кэши вывода
ASP.NET и IIS включена дополнительная возможность кэширования сжатого
содержимого для поддерживающих это клиентов, а также обработка запросов
клиентов, для которых необходимо несжатое содержимое.
Регулировка полосы пропускания
для мультимедийных файлов
С увеличением числа узлов,
предоставляющих медиа-содержимое, затраты на полосу пропускания для многих
организаций значительно возросли. Что еще хуже, теряется большая часть
полосы пропускания мультимедиа из-за того, что отправленное клиенту
медиа-содержимое никогда в действительности не используется. Почему это
происходит?
Вспомните, когда вы последний
раз смотрели интерактивное видео или видели видеорекламу при просмотре
веб-узлов. Вы досмотрели видео до конца? Чаще всего пользователи,
посещающие узлы с видео, просматривают только часть видео до того, как
перейти к следующему или уйти с веб-страницы. Однако веб-сервер,
использующий прогрессивную загрузку для предоставления видео, обычно
отправляет гораздо больше данных, чем необходимо для этих нескольких
секунд воспроизведения. Большая часть данных никогда не используется.
Если среднее время просмотра
ваших видео составляет всего 5 секунд, но за это время предоставляются
(буферизируются) видеоданные длительностью 30 секунд, скорее всего, вы
теряете более 80 процентов полосы пропускания!
Год назад для разрешения этой
проблемы для клиента, переходящего на бета-выпуск IIS 7.0, я написал
модуль регулировки полосы пропускания, автоматически определяющий скорость
видео и обеспечивающий предоставление сервером видео клиенту
приблизительно с этой же скоростью. Группа мультимедиа IIS использовала
этот модуль, называющийся модулем регулировки скорости (см. рис.
4) и доступный в центре загрузок iis.net (iis.net/downloads/?tabid=34&g=6&i=1640).
Более подробно об этом можно узнать в блоге Скотта Гатри (Scott Guthrie)
(доступен по адресу go.microsoft.com/fwlink/?LinkId=122514).
Рис. 4. Регулировки скорости
уменьшает использование полосы пропускания
Модуль регулировки скорости
автоматически определяет скорость кодирования наиболее популярных типов
видео. Можно контролировать объем данных, предварительно отправляемых
клиенту, для устранения начальных задержек на буферизацию (быстрый запуск)
и процент скорости кодирования для предоставления содержимого. Также можно
настраивать множество других параметров, таких как максимальная полоса
пропускания и одновременные подключения, и управлять модулем программно.
Кэширование выводимых
данных
Вообще говоря, кэширование – это
лучший способ увеличения производительности приложений, выполняющих
повторяющиеся операции. В отличие от улучшений производительности
отдельных приложений, для чего часто требуется множество усилий и работа с
затратами на обработку приложения, кэширование устраняет загрузку
повторяющихся запросов для одного содержимого.
До IIS 7.0, как IIS, так и
ASP.NET предоставляли возможности кэширования в форме кэша ядра IIS и кэша
вывода ASP.NET. Кэш ядра IIS обеспечивал максимальную производительность,
но ограничивался преимущественно статическим содержимым. Кэш вывода
ASP.NET был гораздо более полным решением для кэширования динамического
содержимого, за исключением более низкой производительности и менее
эффективного управления памятью. Новый кэш вывода в IIS 7.0 ликвидирует
разрыв между кэшем ядра IIS и кэшем вывода ASP.NET.
Кэш вывода IIS 7.0 обеспечивает
возможность кэширования динамического содержимого из любого приложения,
включая ASP, ASP.NET, PHP и любых других платформ приложений, совместимых
с IIS 7.0. Предоставляя базовую поддержку изменчивости и срока действия
содержимого, эта новая функция позволяет реализовывать кэширование для
содержимого, которое не может кэшироваться кэшем ядра IIS. Кэш ядра
по-прежнему может использоваться для содержимого, не соответствующего
ограничениям.
Кроме того, кэш ядра IIS 7.0
также предоставляет высокопроизводительную альтернативу кэшу вывода
ASP.NET для содержимого ASP.NET, не требующего дополнительных функций
кэширования (таких как зависимости кэша и недействительность данных в
кэше), которые доступны только в кэше вывода ASP.NET.
Что касается кэширования
выводимых данных, обычно проблемы связаны с определением верных политик
срока действия содержимого, недействительности данных и изменчивости,
обеспечивающих эффективное кэширование ответов и одновременное поддержание
необходимой правильности и свежести кэша. В большинстве случаев это можно
выполнить путем простой настройки верных правил кэширования, хотя иногда
требуются более сложные политики, зависящие от информации времени
выполнения. Для решения этой проблемы кэш вывода IIS 7.0 предоставляет
программные API, которые могут использоваться для обеспечения необходимого
поведения кэширования. Это разблокирует потенциал эффективности
кэширования для содержимого, кэширование которого в противном случае было
бы невыгодным. Кроме того, интегрированный конвейер ASP.NET позволяет
использовать кэш вывода ASP.NET для содержимого, не относящегося к
ASP.NET.
Развертывание кэширования вывода
для динамического содержимого может быть сложным и может требовать
многоуровневой стратегии для использования преимуществ эффективности и
гибкости различных функций кэширования на платформе IIS 7.0. Развертывание
часто включает описание множества параметров, влияющих на ответ, и
определение стратегий срока действия и недействительности для поддержания
свежести кэша, а также последующее определение кэша, поддерживающего
необходимую семантику.
Но выполнение этой сложной
работы почти всегда оправдано. Реализация кэша вывода IIS 7.0 позволяет в
несколько раз улучшить общую пропускную способность приложения и
соответственно уменьшить нагрузку на базу данных и компоненты уровня
предприятия.
Преобразование кода ISAPI в
модули IIS 7.0
В IIS 7.0 появился новый
серверный интерфейс API, на котором основаны все модули IIS 7.0. Он
заменяет устаревшие интерфейсы API ISAPI Filter и ISAPI Extension,
использовавшиеся в предыдущих версиях IIS. Для новых модулей, которым не
требуется поддержка предыдущих версий, новые API более просты в
использовании, позволяют улучшить надежность серверного кода и гораздо
более эффективны.
Однако IIS 7.0 предоставляет
возможность поддержки существующих фильтров и расширений ISAPI путем
использования слоя совместимости, реализуемого посредством дополнительных
модулей IIS 7.0. Это позволяет существующим компонентам ISAPI работать в
IIS 7.0 без необходимости переписывания.
Хотя использование существующих
вложений в ISAPI снижает планку для перехода на IIS 7.0, следует серьезно
рассмотреть перенос устаревшего кода ISAPI на новые API IIS 7.0. Это
устраняет затраты на слой совместимости ISAPI и позволяет использовать
преимущества производительности, недоступные для компонентов ISAPI. В
зависимости от работы, выполняемой компонентом ISAPI, эти преимущества
производительности могут быть довольно значительными. Например, API модуля
IIS 7.0 предоставляет встроенную поддержку кэширования метаданных
конфигурации и других произвольных данных, связанных с узлами,
приложениями, URL-адресами, что можно значительно увеличить скорость
выполнения внутренних операций компонента.
Помимо этого, API модуля IIS
позволяет модулям асинхронно выполнять длительные операции, такие как
получение данных объекта запроса и отправка ответа. Асинхронное выполнение
этих задач позволяет серверу масштабироваться до большого количества
одновременно клиентов (десятки тысяч) вместо прежнего максимального
количества в несколько десятков или самое большое нескольких сотен
одновременных клиентов из-за ограничений количества потоков запросов.
Асинхронная обработка также может устранить эффект обработки на других
запросах и действиях в приложении, снизить загрузку памяти и обеспечить
гораздо лучшее использование ЦП.
Помимо определенных шаблонов,
влияющих на производительность, собственный интерфейс API предоставляет
разработчикам большую гибкость работы с задачами обработки запросов. Это
позволит улучшить архитектуру серверного компонента и, в свою очередь,
повысить эффективность. Например, определенные задачи фильтрации, для
которых ранее требовались расширения ISAPI с подстановочными символами и
выполнение дочернего запроса, теперь могут быть выполнены в модуле во
время исходного запроса, а также могут разрешить кэширование ядра IIS для
ответа.
Для этого могут быть необходимы
определенные эксперименты и прототипы для определения оптимальной
архитектуры, наилучшим образом использующую улучшения перехода. Из-за
фундаментальных архитектурных различий ISAPI и API модуля IIS 7.0 прямой
маршрут переноса не всегда является верным. Хорошая новость заключается в
том, что API модуля IIS 7.0 также более прост в использовании, чем ISAPI,
что упрощает переход.
Расширяемость сервера
IIS 7.0 предоставляет сквозную
расширяемость. Для этого требуются значительные заблаговременные знания
работы сервера, но это также позволяет добиться значительного повышения
производительности отдельных приложений. Понимание архитектуры сервера и
обработки запроса позволяет использовать преимущества этой расширяемости
для создания специальных эффективных решений, отвечающих вашим требованиям
к приложениям, рабочей нагрузке и оборудованию.
Это может быть выполнено путем
замены каких-либо встроенных функций IIS 7.0 пользовательскими
реализациями. Хотя IIS 7.0 претерпели значительную оптимизацию и
тестирование производительности, они, конечно же, не оптимизированы для
всех возможных применений. Поэтому можно повысить производительность
определенных модулей путем создания оптимизаций для конкретной рабочей
нагрузки. Например, можно решить повторно реализовать модуль вывода
каталогов для кэширования списков содержимого каталогов в памяти вместо
использования интерфейсов API операционной системы для перечисления
файлов.
Также расширяемость может
использоваться для создания новых функций повышения производительности.
Встроенные примеры таких функций включают кэш вывода, модули сжатия и
несколько других внутренних кэшей.
Для того, чтобы определить, что
пользовательская функция повышения производительности действительно
необходима, нужно понимать характеристики производительности приложения и
его рабочей нагрузки, а также знать ограничение, которое требуется
устранить. IIS 7.0 предоставляет достаточную диагностическую поддержку для
выполнения анализа, который помогает сделать требования и возможную
архитектуру необходимых функций более ясными.
Заключение
Хотя выпуск IIS 7.0 в основном
является функциональным, он предлагает заслуживающие внимания улучшения
производительности, обусловленные его модульной архитектурой,
настраиваемостью и новыми функциями производительности. Эти улучшения
могут помочь добиться значительных экономических выгод через консолидацию
серверов и уменьшения используемой полосы пропускания, а также повысить
удобство работы пользователей.
Для верного использования
множества этих улучшений часто необходимо выполнение тщательного анализа
текущей платформы приложений и хорошие знания архитектуры IIS 7.0.
Дополнительные сведения об архитектуре IIS 7.0 и упомянутых в этой статье
функциях доступны на веб-узле iis.net. На веб-узле mvolo.com я буду вести блог о методах
упреждающего использования IIS 7.0 для повышения производительности
приложений и снижения эксплуатационных издержек.