Подтвердить что ты не робот

ASP.NET IIS - когда запросы находятся в очереди?

следующая статья в статье Томаса Марквардта описывает, как IIS обрабатывает запросы ASP.Net, рабочие потоки рабочей среды max/min/Managed IO, которые можно настроить для запуска, различные очереди запросов и их размеры по умолчанию.

Теперь, согласно статье, в IIS 6.0 происходит следующее:

  • ASP.NET собирает запросы из потока IO IO и публикует "HSE_STATUS_PENDING" для IO IO Thread
  • Запросы передаются в поток рабочей среды CLR
  • Если запросы имеют высокую задержку и все потоки заняты (количество потоков приближается к httpRuntime.minFreeThreads), то запросы отправляются в очередь запросов уровня приложения (эта очередь для AppDomain)
  • Также ASP.NET проверяет количество одновременно выполняемых запросов. В статье говорится, что "если количество одновременных выполнения запросов слишком велико", он ставит очереди входящих запросов в глобальную очередь запросов ASP.NET(это для каждого рабочего процесса) (проверьте Update 2)

Я хочу знать, что такое "пороговое значение", с которого ASP.NET считает, что количество запросов в настоящее время слишком велико, а затем запускает очереди в глобальную очередь запросов ASP.NET?

Я думаю, что этот порог будет зависеть от конфигурации максимального числа рабочих потоков, но может быть какая-то формула, на основе которой ASP.NET будет определять, что количество одновременно выполняемых запросов слишком велико и начинает очереди запросов к Глобальная очередь запросов ASP.NET. Что может быть эта формула? или этот параметр настраивается?


Обновление
Я прочитал статью снова, и в разделах комментариев я нашел это:

1) В IIS 6 и в классическом режиме IIS 7 каждое приложение (AppDomain) имеет очередь, которую он использует для поддержания доступности рабочего потоки. Количество запросов в этой очереди увеличивается, если число доступных рабочих потоков падает ниже предела, указанного httpRuntime minFreeThreads. Когда предел, указанный в httpRuntime appRequestQueueLimit превышено, запрос отклонен с кодом статуса 503, и клиент получает HttpException с сообщением "Сервер слишком занят". Существует также Счетчик производительности ASP.NET, "Запросы в очереди приложений", который указывает, сколько запросов находится в очереди. Да, поток CLR пул - это класс, открытый классом .NET ThreadPool.

2) RequestQueueLimit плохо назван. Фактически это ограничивает максимальное количество запросов, которые могут обслуживаться ASP.NET одновременно. Это включает в себя как запросы, поставленные в очередь, так и запросы, которые выполняются. Если производительность "Запросы текущие" счетчик превышает requestQueueLimit, новые входящие запросы будут отклонен с кодом статуса 503.

Таким образом, по существу requestQueueLimit ограничивает количество запросов, которые находятся в очереди (я предполагаю, что он будет суммировать количество запросов, помещенных в очередь приложений, плюс глобальную очередь запросов ASP.Net плюс количество выполняемых в настоящее время запросов) и выполняются. Все, хотя это не отвечает на исходный вопрос, оно предоставляет информацию о том, когда мы можем получить ошибку занятости 503 сервера из-за большого количества одновременных запросов/запросов с высокой задержкой. (Проверить обновление 2)


Обновление 2 В моем понимании была ошибка. Я перепутал описания для IIS 6 и IIS 7.
По сути, когда ASP.NET размещен в IIS 7.5 и 7.0 в интегрированном режиме, очереди на уровне приложений больше не присутствуют, ASP.NET поддерживает глобальную очередь запросов.
Таким образом, IIS 7/7.5 начнет очереди запросов к глобальной очереди запросов, если количество выполняемых запросов будет считаться высоким. Этот вопрос больше применим к IIS 7/7.5, а не к 6.

До сих пор IIS 6.0что глобальная очередь запросов ASP.NET отсутствует, но верно следующее:
1. ASP.NET собирает запросы из потока IO IO и публикует "HSE_STATUS_PENDING" для IOS IO Thread
2. Запросы передаются рабочей ветке CLR
3. Если запросы имеют высокую задержку и все потоки заняты (количество потоков приближается к httpRuntime.minFreeThreads), то запросы отправляются в очередь запросов уровня приложения (эта очередь для AppDomain)
4. Также ASP.NET проверяет количество запросов, находящихся в очереди и выполняющихся в настоящее время, перед принятием нового запроса. Если это число больше значения, указанного processModel.requestQueueLimit, тогда входящие запросы будут отклонены с ошибкой занятости 503.

4b9b3361

Ответ 1

Эта статья может помочь понять настройки немного лучше.

minFreeThreads: Этот параметр используется рабочим процессом для очереди всех входящих запросов, если количество доступных потоков в пул потоков падает ниже значения для этой настройки. Этот параметр эффективно ограничивает количество запросов, которые могут выполняться одновременно с maxWorkerThreads minFreeThreads. Установите minFreeThreads на 88 * # из ЦП. Это ограничивает количество одновременных запросов до 12 (при условии, что maxWorkerThreads - 100).

Edit:

В этой SO post Томас предоставляет более подробную информацию и примеры обработки запросов в интегрированном конвейере. Обязательно прочитайте комментарии к ответам для дополнительных объяснений.

Настраиваемый обратный вызов (в webengine.dll) запрашивает у сотрудника CLR thread, мы сравниваем maxConcurrentRequestsPerCPU * CPUCountактивные запросы. Если мы превысили лимит, запрос вставляется в глобальная очередь (собственный код). В противном случае он будет выполнен. Если бы это было в очереди, он будет удален после завершения одного из активных запросов.