2012-06-07 30 views
29

El artículo following de Thomas Marquardt describe cómo IIS maneja las solicitudes ASP.Net, los hilos de trabajo CLR max/min/hilos IO gestionados que pueden configurarse para ejecutarse, las diversas colas de solicitudes implicadas y sus tamaños predeterminados.ASP.NET IIS: ¿cuándo están en cola las solicitudes?

Ahora según el artículo, ocurre lo siguiente en IIS 6.0:

  1. ASP.NET recoge las peticiones de un hilo IIS IO y mensajes "HSE_STATUS_PENDING" a IIS IO Thread
  2. Las solicitudes se entregado a un subproceso CLR Worker
  3. Si las solicitudes son de alta latencia y todos los subprocesos están ocupados (el recuento de subprocesos se acerca a httpRuntime.minFreeThreads), las solicitudes se publican en la cola de solicitud de nivel de aplicación (esta cola es por AppDomain)
  4. También ASP.NET verifica el número de solicitudes de ejecución simultáneas. El artículo afirma que "si el número de solicitudes que se ejecutan simultáneamente es demasiado alto" pone en cola las peticiones entrantes a una cola de solicitudes ASP.NET mundial (esto es por proceso de trabajo) (Por favor marque Actualizar 2)

I ¿Desea saber cuál es el "valor de umbral" en qué punto ASP.NET considera que el número de solicitudes que lo ejecutan actualmente es demasiado alto y luego comienza a poner en cola las solicitudes a la cola de solicitudes de ASP.NET global?

Creo que este umbral dependerá de la configuración del número máximo de subprocesos de trabajo, pero puede haber alguna fórmula basada en la cual ASP.NET determinará que el número de solicitudes simultáneas es demasiado alto y comienza a poner en cola las solicitudes la cola de solicitud global de ASP.NET. ¿Qué podría esta fórmula? o esta configuración es configurable?


actualización
leí a través del artículo de nuevo y en las secciones de comentarios me encontré con esto:

1) En IIS 6 y en IIS 7 modo clásico, cada aplicación (AppDomain) tiene una cola que utiliza para mantener la disponibilidad de subprocesos de trabajador. El número de solicitudes en esta cola aumenta si el número de los hilos de trabajo disponibles cae por debajo del límite especificado por httpRuntime minFreeThreads. Cuando se excede el límite especificado por httpRuntime appRequestQueueLimit, la solicitud es rechazada con un código de estado 503 y el cliente recibe una HttpException con el mensaje "Servidor demasiado ocupado". También hay un contador de rendimiento ASP.NET , "Solicitudes en la cola de solicitud", que indica cuántas solicitudes hay en la cola. Sí, el grupo de subprocesos CLR es el expuesto por la clase .NET ThreadPool.

2) requestQueueLimit tiene un nombre pobre. En realidad, limita el número máximo de solicitudes que ASP.NET puede atender al mismo tiempo. Esto incluye tanto las solicitudes que están en cola como las solicitudes que se están ejecutando. Si el contador de rendimiento "Solicita corriente" excede requestQueueLimit, las nuevas solicitudes entrantes serán rechazadas con un código de estado 503.

Así que, esencialmente requestQueueLimit limita el número de solicitudes que están en cola (Estoy asumiendo que se suma el número de solicitudes en cola en las colas de la aplicación, más la cola de peticiones ASP.Net mundial más el número de solicitudes ejecutando en ese momento) y están ejecutando. Aunque esto no responde a la pregunta original, proporciona información sobre cuándo podríamos recibir un error de servidor ocupado 503 debido a la gran cantidad de solicitudes simultáneas/solicitudes de alta latencia. (comprobación de actualizaciones 2)


Actualización 2 Hubo un error en mi parte en el entendimiento. Mezclé las descripciones para IIS 6 e IIS 7.
Esencialmente cuando ASP.NET está alojado en IIS 7.5 y 7.0 en modo integrado, las colas de nivel de aplicación ya no están presentes, ASP.NET mantiene una cola de solicitud global.
De modo que IIS 7/7.5 comenzará a poner en cola solicitudes a la cola de solicitudes globales si el número de solicitudes de ejecución se considera alto. La pregunta se aplica más a IIS 7/7.5 en lugar de 6.

Por lo IIS 6.0 se refiere, no hay una cola de solicitudes ASP.NET mundial, pero el siguiente es cierto:
1. ASP. NET recoge las solicitudes de un IIS IO Thread y publica "HSE_STATUS_PENDING" en IIS IO Thread
2. Las solicitudes se entregan a un hilo CLR Worker
3. Si las solicitudes son de alta latencia y todos los hilos están ocupados (el recuento de subprocesos se aproxima a httpRuntime.minFreeThreads), a continuación, las solicitudes se publican en la cola de solicitud de nivel de aplicación (esta cola es por dominio de aplicación)
4. También ASP.NET verifica el número de solicitudes en cola y que se están ejecutando actualmente antes de aceptar una nueva solicitud. Si este número es mayor que el valor especificado por processModel.requestQueueLimit, las solicitudes entrantes se rechazarán con el error de servidor ocupado 503.

+0

Las actualizaciones que he agregado a la pregunta han hecho que la pregunta sea potencialmente menos relevante para IIS 7/7.5. Y las actualizaciones proporcionan la respuesta sobre IIS 6.0 – Ngm

+0

El artículo con el que se vinculó dice que el umbral está determinado por MaxConcurrentRequestsPerCPU. ¿Hay alguna razón por la que no crees que este sea el caso? – RandomEngy

Respuesta

2

This article pueden ayudar a entender la configuración un poco mejor.

minFreeThreads: Esta configuración se usa en el proceso de trabajo de cola todas las solicitudes entrantes si el número de hilos disponibles en la piscina el hilo cae por debajo del valor de esta configuración. Esta configuración limita efectivamente el número de solicitudes que se pueden ejecutar simultáneamente en maxWorkerThreads minFreeThreads. Establezca minFreeThreads en 88 * # de CPUs. Esto limita el número de solicitudes simultáneas a 12 (suponiendo que maxWorkerThreads sea 100).

Editar:

En este SO post, Thomas proporciona más detalles y ejemplos de manipulación en la tubería integrada petición. Asegúrese de leer los comentarios en la respuesta para obtener explicaciones adicionales.

una devolución de llamada nativa (en Webengine.dll) recoge solicitud en trabajador CLR hilo, comparamos maxConcurrentRequestsPerCPU * CPUCount a un total de solicitudes activas.Si hemos excedido el límite, la solicitud se inserta en la cola global (código nativo). De lo contrario, se ejecutará. Si fue en cola, se eliminará cuando se complete una de las solicitudes activas.

+0

Sí, lo hace en IIS 6.0. También mencioné la pregunta: si las solicitudes son de alta latencia y todos los subprocesos están ocupados (el recuento de subprocesos se acerca a httpRuntime.minFreeThreads), las solicitudes se publican en la cola de solicitud de nivel de aplicación (esta cola es por dominio de aplicación) – Ngm

+0

Usted Tiene razón, eso solo se aplica al grupo de aplicaciones clásico. – ulty4life

Cuestiones relacionadas