2009-03-18 7 views
23

Me han dicho que ASP.NET tiene varios subprocesos por defecto en IIS. ¿Cómo se logra este enhebrado?¿Cómo es ASP.NET multiproceso?

¿El conjunto de servidores envía solicitudes diferentes a diferentes núcleos?

¿Una sola solicitud hace uso de varios núcleos?

Más importante aún, ¿hay alguna ventaja en agregar subprocesos al código ASP.NET si el subprocesamiento se realiza más arriba en IIS?

+3

Cualquier sitio web de diseño es multi-hilo, cada solicitud se sirve en gran parte en paralelo con todas las demás solicitudes –

Respuesta

5

IIS hace uso de múltiples núcleos automáticamente (alt Aunque puede apagarlo si así lo desea).

La ventaja de agregar subprocesos al código ASP.NET es que usted puede controlar el funcionamiento interno de su propia aplicación y no verse forzado a depender de IIS para tomar todas las decisiones por usted.

+0

Esa es una vaga ventaja –

+0

Haga una pregunta vaga, obtenga una respuesta vaga. La única respuesta precisa posible para la última de las cuatro preguntas originales es "depende". –

3

Generalmente, se genera un subproceso diferente para cada nueva solicitud, luego el sistema operativo realiza la programación del procesador. A menos que necesite procesar solo unas pocas solicitudes al mismo tiempo, no necesita un enhebrado adicional.

+0

Tu respuesta sugiere que una solicitud permanecerá en el mismo hilo durante toda su vida, lo que no es cierto (y esa suposición puede causar problemas si usas estadísticas estáticas). –

+0

Bueno, nunca desarrollamos programas conscientes de la agilidad del hilo, por lo que no tenía idea de esto previamente. – sharptooth

+0

¿No usa IIS también un grupo de subprocesos? Afaik genera hilos al inicio, luego los reutiliza entre solicitudes. – Mendelt

23

El servidor no solo genera diferentes solicitudes a diferentes subprocesos, sino que una sola solicitud puede cambiar el hilo durante el transcurso del ciclo de vida. Esto se llama thread agility. Estoy buscando un buen artículo que lo explique ...

EDIT: Aún no hay artículos definitivos, pero one blog post explicando algunas de las dificultades.

EDIT: Más vínculos de los comentarios:

+1

Pero una solicitud no se ejecuta en más de un hilo en un momento dado, por lo que al final del día todo el manejo de las solicitudes se puede ver como un único subproceso. (¿O no?) – Tomalak

+1

@Tomalak: No, no se puede considerar de subproceso único, porque puede cambiar el hilo. Eso significa que si coloca cosas en una variable [ThreadStatic] al comienzo de la solicitud, puede que no estén allí al final de la solicitud. –

+0

@Jon Supongo que esto complica aún más la idea de generar otros hilos dentro de una solicitud, ¿no es así? – sharptooth

8

ASP.net usa .Net threadpool (que es configurable) Cada solicitud es recibida por uno de los hilos en el threadpool, hasta que cada thread ya esté ocupado. Luego solicita cola en la Pila IIS, hasta que esto también se extienda. A partir de allí, las nuevas solicitudes se encuentran con el muy feo mensaje "El servidor no está disponible".

Esta es la historia habitual de 'multi-threading' para un sitio web de ASP.net.

Existen muchas formas de garantizar la escalabilidad. La más obvia es la prueba de rendimiento y la eliminación de cuellos de botella de su código.

ASP.net realmente puede aprovechar los múltiples núcleos al utilizar los hilos de E/S para cualquier solicitud de E/S. Es un código feo pero rápido nunca ha sido bonito.

Esta es la definitiva MSDN MAG post sobre cómo hacer esto

ACTUALIZACIÓN

Bueno, yo probablemente intento de responder a su pregunta completa:

"Lo más importante es que hay alguna ventaja para agregar subprocesos al código ASP.NET si el subprocesamiento se hace más alto en IIS? "

La respuesta corta es: ¡Depende! Si está esperando en un proceso de larga duración, entonces sería mejor que se poner en práctica una experiencia más agradable para el cliente solicitante (es decir, fuera de banda llamadas AJAX)

si tiene varias tareas independientes que necesitan ser completadas para el cliente solicitante: entonces es mejor que generes un nuevo proceso para ejecutar las tareas en paralelo.

Si su sitio recibe gran cantidad de tráfico, entonces usted realmente necesidad de considerar la implementación de patrones asincrónicos para utilizar mejor su CPU