Первый ответ веб-службы медленный, даже если установлен модуль инициализации приложения
Тестовый веб-сервис WCF, который я размещал с использованием IIS 7.5, постоянно медленно реагирует на вызовы, сделанные после периода бездействия (т. Е. Первого вызова каждого дня).
Изучив эту тему, я понял, что проблема "разминки приложения" часто встречается при использовании IIS (например, см. Здесь).
Я предпринял обычные шаги, которые рекомендуется попробовать и смягчить эту проблему:
- Установил модуль инициализации приложения.
- Отключен тайм-аут простоя пула приложений и регулярный интервал времени перезарядки (т.е. установите для них значение "0").
- Отредактировано
applicationhost.config
файл так, чтобыautoStart=True
а такжеstartMode="alwaysRunning"
для необходимого пула приложений, иpreloadEnabled="true"
для моего приложения.
С этими настройками я ожидаю, что пул приложений немедленно раскрутит рабочий процесс при запуске IIS и ускорит новый рабочий процесс при выходе из существующего. Кроме того, я ожидаю, что приложение будет загружено в рамках рабочего процесса.
Однако для первого вызова каждого дня в журналах показывается, что разница во времени между клиентом, выполняющим вызов, и веб-службой, принимающей вызов, может составлять до 10 секунд. Последующие вызовы обычно обрабатываются менее чем за 2 секунды.
Любопытно, что длительное время отклика не воспроизводится путем вызова после iisreset
команда. Я ожидаю, что такая жесткая операция поставит веб-сервис в столь же "холодную" ситуацию, однако, похоже, это не так.
Я бы хотел знать:
- Что еще может быть причиной задержки в приложении "прогрев"?
- Какая разница в состоянии веб-сервиса после
iisreset
и длительный период бездействия? - Должен ли я прибегнуть к "сердцебиению", чтобы регулярно проверять сервис, чтобы поддерживать его работу?
Заранее спасибо за любые советы или понимание.
1 ответ
Я постараюсь помочь с вашими вопросами:
Что еще может быть причиной задержки в приложении "прогрев"?
Разогреть приложение не значит разогреть его ресурсы. Например, если вы настраиваете Автозапуск с Application Fabric в своем приложении WCF ( https://msdn.microsoft.com/en-us/library/ee677260(v=azure.10).aspx), и это приложение обращается к базе данных используя EF, он не будет инициировать ваш DBContext. Если вы хотите, чтобы эти ресурсы были инициализированы после того, как ваше приложение прогрелось, вам нужно реализовать метод для инициализации ваших ресурсов, например, кеш, DBContext и т. Д.
Какая разница в состоянии веб-службы после iisreset и длительного периода бездействия?
Когда приложение тратит много времени на бездействие, вероятно, пул приложений отключается и перезапускается при получении любого запроса, как это происходит при повторной обработке. Эта ссылка содержит интересную информацию о разнице между iisreset и перезапуском пула приложений, и может помочь ответить на ваш вопрос: https://fullsocrates.wordpress.com/2012/07/25/iisreset-vs-recycling-application-pools/
Должен ли я прибегнуть к "сердцебиению", чтобы регулярно проверять сервис, чтобы поддерживать его работу?
Если вы продолжаете получать доступ к своему сервису, он, вероятно, сохранит свои ресурсы инициализированными в памяти, поэтому может быть хорошим подходом. В любом случае, если ваш пул приложений настроен на перезапуск через некоторый интервал времени, он будет переработан и ваши ресурсы в памяти будут потеряны. Если это кажется вам проблемой, просто отключите эту функцию, перейдя в IIS -> Пул приложений -> Расширенные настройки и установите Regular Time Interval=0. Для этой проблемы это всего лишь несколько советов, вам нужно сделать несколько тестов и выяснить, как лучше решение.