2009-01-12 8 views
12

Esto podría ser un poco una pregunta tonta pero;Es ASP.NET multiproceso (cómo se ejecutan las solicitudes)

Si tengo dos personas que inicien sesión en mi sitio al mismo tiempo, ¿se ejecutará el código del lado del servidor uno después del otro o se ejecutarán simultáneamente en hilos separados?

Tengo curiosidad con respecto a un ataque de denegación de servicio en el inicio de sesión de un sitio web. ¿Se ralentiza el servidor porque tiene una gran cola de inicios de sesión o es lento porque tiene mil millones de inicios de sesión simultáneos!

Respuesta

13

Esto no está relacionado con ASP.NET per se (no tengo muy poco conocimiento en ese área), pero generalmente servidores web. La mayoría de los servidores web usan subprocesos (o procesos) para manejar las solicitudes, por lo tanto, básicamente, cualquier fragmento de código que tenga se ejecutará para ambas conexiones en paralelo. Por supuesto, si accede a una base de datos u otro sistema de back-end donde se coloca un candado, permitiendo que solo una sesión realice consultas, es posible que haya serializado implícitamente todas las solicitudes.

Los servidores web suelen tener un número mínimo y máximo de trabajadores, que están sintonizados con el hardware actual (CPU, memoria, etc.). Si se agotan, las nuevas solicitudes se pondrán en cola esperando que un trabajador esté disponible, o hasta que se haya alcanzado la longitud máxima de espera de las solicitudes pendientes, ignorando las conexiones nuevas, negando de hecho el servicio (si esto es a propósito, se llama una denegación de servicio o un ataque DoS).

Por lo tanto, en sus términos es una combinación, es una gran cantidad de solicitudes simultáneas que llenan la cola.

+0

¿Hay un número máximo de solicitudes que pueden manejarse? ¿Ese máximo incluye múltiples sitios web alojados en el mismo servidor? Ejemplo: si un servidor web puede manejar 5000 solicitudes, y hay dos sitios web alojados en ese servidor, ¿esto significa que tiene 5000 solicitudes en ambos sitios web? –

2

Debe usar un grupo de subprocesos. Tenga en cuenta que todavía están en la misma aplicación, por lo que los elementos de nivel de aplicación, como las variables estáticas, aún se comparten entre ellos.

1

de this article

"Recuerde ISAPI es multi-hilo lo solicite se venir en en varios subprocesos a través de la referencia que fue devuelto por ApplicationDomainFactory.Create(). Listado 1 muestra el código desensamblado del método IsapiRuntime.ProcessRequest que recibe un objeto y tipo de servidor ISB de ISAPI como parámetros. El método es seguro para la ejecución de subprocesos, por lo que múltiples hilos ISAPI pueden llamar de forma segura a esta única instancia de objeto devuelto simultáneamente ".

Así que sí, en el caso de un ataque DoS, sería lento debido a la gran cantidad de conexiones

1

Como han dicho otros, la mayoría de los servidores web usan múltiples procesos o subprocesos (mejor) para atender múltiples solicitudes a la vez. En particular, puede configurar cada grupo de aplicaciones ASP.NET con un número máximo de solicitudes en cola y procesos máximos de trabajo. Cada proceso tiene múltiples subprocesos hasta un máximo (no se puede configurar AFAIK, puedo estar equivocado), y las solicitudes entrantes se procesan según el primero en entrar, primero en salir.

Además, ASP.NET procesa una única solicitud para cada sesión, pero un usuario malintencionado puede abrir tantas sesiones como desee.

Los inicios de sesión múltiples probablemente golpearán la base de datos y la pondrán de rodillas probablemente antes del servidor web.

Hasta donde yo sé, no existe una forma integrada de acelerar las solicitudes de ASP.NET que no sea establecer el número máximo de solicitudes en cola (esperando a ser procesadas). Este número debería ser idealmente muy pequeño. Puede controlar el número de ASP en cola.Solicitudes NET usando contadores de rendimiento. Supongamos que encuentra que, en el tráfico pico, este número es 100. Luego puede actualizar la aplicación para que rechace los intentos de inicio de sesión cuando este número sea superior a 100 para que no se golpee la base de datos (nunca lo hizo, solo un pensamiento).

Cuestiones relacionadas