Una aplicación ASP.NET sobre IIS escala muy bien y tiene muy buen resultado cuando hablamos de peticiones por segundo, pero la cosa puede mejorar cuando hablamos de conexiones concurrentes.
Teniendo en cuenta que cada vez más nuestras aplicaciones son asíncronas, está aumentando la cantidad de peticiones que nuestra aplicación tiene que soportar .
Por defecto ASP.NET 4.o acepta 5.000 peticiones concurrentes por CPU
Peticiones concurrentes por CPU:
Una aplicación ASP.NET en modo integrado bajo IIS7 nos permite configurar cómo administrar los subprocesos y como poner en cola las solicitudes cuando la aplicación está hospedada en un grupo de aplicaciones de IIS.
Los valores applicationPool se aplican a todos los grupos de aplicaciones que se ejecutan en una versión determinada de .NET Framework. La configuración está contenida en un archivo aspnet.config. Hay una versión de este archivo para las versiones 2.0 y 4 de .NET Framework. (Las versiones 3.0 y 3.5 de .NET Framework comparten el archivo aspnet.config con la versión 2.0.)
- maxConcurrentRequestPerCPU: Especifica cuántas solicitudes simultáneas permite ASP.NET por CPU.
- maxConcurrentThreadsPerCPU: Especifica cuántos subprocesos simultáneos se pueden estar ejecutando para un grupo de aplicaciones para cada CPU. Esto proporciona una manera alternativa de controlar la simultaneidad de ASP.NET, ya que puede limitar el número de subprocesos administrados que se pueden usar por CPU para atender las solicitudes. De forma predeterminada este valor es 0, lo que significa que ASP.NET no limita el número de subprocesos que se pueden crear por CPU, aunque el grupo de subprocesos de CLR también limita el número de subprocesos que se pueden crear.
- requestQueueLimit: Especifica el número máximo de solicitudes que se pueden poner en cola para ASP.NET en un único proceso. Cuando dos o más aplicaciones ASP.NET se ejecutan en un único grupo de aplicaciones, el conjunto acumulativo de solicitudes que se realizan a cualquier aplicación del grupo de aplicaciones está sujeto a este valor.
Para configurar nuestra aplicación que trabaja con el framework 4.0 x64
- fichero de configuración :
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet.config
- Modificar el fichero
[sourcecode language=»xml»]
<configuration>
<system.web>
<applicationPool maxConcurrentRequestsPerCPU="5000"
maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000" />
</system.web>
</configuration>
[/sourcecode]
Peticiones concurrentes por Aplicación:
Si lo que queremos es controlar la peticiones concurrentes por aplicación nos tendremos que ir a la configuración serverRuntime de nuestro servidor IIS.
- appConcurrentRequestLimit: Especifica el número máximo de solicitudes que pueden poner en cola para una aplicación. El valor predeterminado es 5.000.
Modificamos la configuración del servidor:
- Abrimos el fichero de configuración:
%windir%\System32\inetsrv\config\applicationHost.config
- Buscar el elemento
serverRuntime
- Modificar la propiedad
appConcurrentRequestLimit
que por defecto son 5.000
[sourcecode language=»xml»] <serverRuntime appConcurrentRequestLimit="250000" /> [/sourcecode]
Además se puede controlar el tamaño de las cola que utiliza ASP.NET cuando se supera la cantidad de solicitudes por CPU estableciendo requestQueueLimit de processModel.
[sourcecode language=»xml»] <processModel autoConfig="false" requestQueueLimit="250000" /> [/sourcecode]
Con todas estas modificaciones podemos controlar mucho mejor el rendimiento de nuestra aplicación y potenciar la gran cantidad de peticiones que se verán incrementadas con el uso de peticiones asíncronas.
Gracias Marc buena explicación.
El mundo de las conexiones sincronas y asincronas, los hilos del IIS y del CLR y como se manejan y configuran es un tema muy interesante que todavía es muy confuso para muchos de nosotros. Yo todavía no he conseguido hacerme la idea de como trabaja.
Un saludo.
Ferson
Pingback: Agenda de la Comunidad « MSExpertos