ASP - Разработка производительных приложений ISAPI
Разработка производительных приложений ISAPI
ISAPI представляет собой высокопроизводительный интерфейс для веб-приложений. Если создается расширение ISAPI или фильтр, велика вероятность того, что будет достигнуто более высокое быстродействие, чем у ASP-сценариев или даже компонентов, выполняющих аналогичные функции.
Однако высокая внутренняя скорость интерфейса ISAPI не означает, что можно не обращать внимание на вопросы быстродействия и масштабируемости. Конечно, ISAPI не может использовать большинство служб поддержки приложений, обеспечиваемых ASP и COM. Если, например, потребуется для приложения ISAPI сохранять состояние сеанса, большая часть функциональности состояния сеанса, должна быть реализована самостоятельно.
Ниже приведены некоторые предложения по улучшению масштабируемости и быстродействия расширений ISAPI:
- Избегайте фильтров ISAPI, если добавление фильтров ISAPI не является абсолютно необходимым для архитектуры приложения. Особенно следует избегать фильтров, выполняющих обработку необработанных входящих и исходящих данных. Если установлено, что фильтр абсолютно необходим, тщательно оптимизируйте пути главной программы через программу извещения о событиях фильтра.
- Создайте собственную группу рабочих потоков, чтобы главные потоки ввода-вывода были освобождены для выполнения других задач. Эта возможность доступна только для расширений ISAPI, а не для фильтров ISAPI. Дополнительные сведения об обработке запросов в IIS см. IIS: обработка запросов. Пример, демонстрирующий группу рабочих потоков, реализованную в расширении ISAPI, приведен в пакете SDK операционной системы.
- Рассмотрите возможность использования асинхронных операций и окончательных портов ввода-вывода, когда возможно. IIS поддерживает асинхронное чтение и записьс помощью окончательных портов ввода-вывода, доступных в Windows NT 4.0 и Windows 2000 и более поздних версий. В зависимости от типа выполняемых операций ввода-вывола, асинхронные операции могут обеспечить лучшее использование времени центрального процессора и обычно работают довольно хорошо, если реализованы с помощью группы рабочих потоков. Дополнительные сведения см. в пакете SDK операционной системы.
- Расширения ISAPI должны использовать функцию Win32 TransmitFile, предоставляемую HSE_REQ_TRANSMIT_FILE ServerSupportFunction. Дополнительные сведения см. в пакете SDK операционной системы.
- Использование соединения: заголовки открытых соединений. Поддержание постоянных соединений HTTP в большинстве случаев обеспечит лучшее быстродействие, чем для непостоянных. Дополнительные сведения см. в пакете SDK операционной системы.
- Минимизируйте необходимость в синхронизации потоков, сохраняя информацию о состоянии с контекстом запроса. Если синхронизация потоков необходима, убедитесь, что критические секции достаточно коротки.
- Если приложение ISAPI интенсивно использует кучу, рассмотрите другие альтернативы использованию кучи. Интенсивное использование кучи Windows® может вызвать конфликт ресурсов. Следует рассмотреть несколько альтернатив выделения памяти, включая:
- Разделение кучи, сопровождаемое созданием нескольких пользовательских куч, в дополнение к стандартной куче процесса. Каждая пользовательская куча должна контролироваться отдельной, не глобальной, блокировкой, а конфликт блокировки должен быть уменьшен.
- Кэшируемое выделение, которое заключается в использовании специальных операций выделения, которые действуют как промежуточный слой между пользователями объекта и кучей. Вызовы кучи Win32 производятся нечасто и только для больших блоков памяти. Эти блоки подразделяются и управляются пользовательской программой распределения памяти.
- Выделение стека, используя функцию языка C _alloca для выделения памяти объектам в стеке вместо кучи. Использование этого метода возможно только для относительно небольших объектов, поскольку пространство, доступное для стека, ограниченно. Кроме того, каждый вновь размещенный объект будет доступен только внутри текущей функции или функций, вызываемых из нее. При завершении текущей функции память, выделенная под стек, будет утеряна.
- Инкапсуляция объектов, сопровождаемая включением буфера в структуру данных класса. Этот буфер затем используется для задач, которые будут требовать доступа к куче Win32.
- Избегайте использования глобальных блокировок внутри ISAPI, если это возможно. Глобальные блокировки часто отрицательно сказываются на масштабируемости.
Дополнительные сведения о расширениях и фильтрах ISAPI см. в документации ISAPI в пакете SDK операционной системы.