2010-12-22 12 views
25

He estado escribiendo un servicio de larga duración en WCF. Estoy en el punto de pruebas de carga y estoy corriendo en un problema de que, cuando llegue a 5000 solicitudes pendientes, que comienza a recibir:Escribir el servicio WCF de larga duración

The HTTP service located at (my service) is too busy. 

he implementado como un servicio WCF y el AsyncPattern El número de hilos de trabajo/IO consumidos sigue siendo muy bajo (como debería). El número de identificadores se ve bien, etc. Estoy pensando que estoy tropezando con uno de los límites de anti-DOS y simplemente no puedo encontrarlo. Estas son algunas de las cosas que he hecho:

He modificado el registro para que MaxConcurrentRequestsPerCPU no sea un problema. De hecho, el número de solicitudes en cola ASP.NET permanece 0.

He configurado el límite de servicio en la configuración web, por lo que no debería ser un problema. Las huellas WCF no muestran ninguna excepción debido a eso.

Estoy usando un enlace personalizado que no incluye ningún tipo de seguridad, etc. Todo lo que tiene es la codificación y el transporte (httpTransport).

He modificado el machine.config a la requestQueueLimit: He aquí el elemento processmodel de que:

<processModel enable="true" 
    timeout="Infinite" 
    idleTimeout="Infinite" 
    shutdownTimeout="0:00:05" 
    requestLimit="Infinite" 
    requestQueueLimit="15000" 
    restartQueueLimit="10" 
    memoryLimit="60" 
    webGarden="false" 
    cpuMask="0xffffffff" 
    userName="machine" 
    password="AutoGenerate" 
    logLevel="Errors" 
    clientConnectedCheck="0:00:05" 
    comAuthenticationLevel="Connect" 
    comImpersonationLevel="Impersonate" 
    responseRestartDeadlockInterval="00:09:00" 
    responseDeadlockInterval="00:03:00" 
    maxWorkerThreads="250" 
    maxIoThreads="250" /> 

Pero aún así termino con este límite (la máquina en cuestión puede manejarlo y el resto del sistema es asincrónico a un sistema de cola de mensajes).

¿Alguien puede pensar en algo más?

Soy IIS 7.5 en WindowsServer 2008R2. Asp.NET 3.5SP1.


Más información: Cuando aparece el error anterior, el contador de rendimiento ASP.Net v2.0.50727 "Solicitudes rechazadas" salta. Los documentos indican que esto sucede cuando la cola de solicitudes está llena. El contador de rendimiento de la cola de solicitudes está en 0 y nunca cambia.

Si arranco los Procesos máximos de trabajo, puedo exceder las 5K solicitudes concurrentes.

+0

¿Cuál es el modelo de instancia que está utilizando? ¿Hay alguna posibilidad de que esté alcanzando un tipo de límite de sesión? Los ajustes del modo de instancia y concurrencia podrían ser otro lugar para mirar ... http://msdn.microsoft.com/en-us/magazine/cc163590.aspx –

+0

Eso es un pensamiento. Cambié a InstanceContextMode = Single, ConcurrencyMode = Multiple en un punto. Había vuelto a investigar algo más. Sin embargo, creo que puede ser un problema de aceleración de ASP.NET. Lo intentaré sin embargo. Soy SessionMode = NotAllowed. –

+0

Entonces No, cambiar el modo de concurrencia no ayudó. –

Respuesta

1

IIS está limitando el número de conexiones abiertas? Creo que hay una configuración en un sitio web o aplicación web en IIS que puede hacer eso.

3

Desde: http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

Para v2.0 y v3.5 establecer un valor DWORD registro @HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\MaxConcurrentRequestsPerCPU = 5000. Reiniciar IIS

Para v3.5, puede establecer como alternativa <system.web><applicationPool maxConcurrentRequestsPerCPU="5000"/></system.web> en el archivo aspnet.config. Si el valor se establece en ambos lugares, la configuración aspnet.config anula la configuración del registro.

Para v4.0, el valor predeterminado maxConcurrentRequestsPerCPU es 5000, por lo que no necesita hacer nada.

Aumente el límite de cola HTTP.sys, que tiene un valor predeterminado de 1000. Si el sistema operativo es x64 y tiene 2 GB de RAM o más, establecerlo en 5000 debería estar bien. Si es demasiado bajo, puede ver solicitudes de rechazo HTTP.sys con un estado 503. Abra el Administrador de IIS y la Configuración avanzada para su Grupo de aplicaciones, luego cambie el valor de "Longitud de cola". Si su aplicación ASP.NET está utilizando servicios web (WFC o ASMX) o System.Net para comunicarse con un servidor por HTTP, es posible que necesite aumentar connectionManagement/maxconnection. Para las aplicaciones ASP.NET, esto está limitado a 12 * #CPU por la función autoconfig. Esto significa que en un quad-proc, puede tener como máximo 12 * 4 = 48 conexiones concurrentes a un punto final de IP. Como esto está relacionado con la configuración automática, la forma más fácil de aumentar la conexión máxima en una aplicación ASP.NET es establecer System.Net.ServicePointManager.DefaultConnectionLimit programáticamente, por ejemplo, desde Application_Start. Establezca el valor en la cantidad de conexiones simultáneas de System.Net que espera que use su aplicación. Configuré esto en Int32.MaxValue y no tuve ningún efecto secundario, por lo que podría intentarlo: este es el valor predeterminado utilizado en la pila HTTP nativa, WinHTTP. Si no puede establecer System.Net.ServicePointManager.DefaultConnectionLimit programáticamente, deberá deshabilitar la configuración automática, pero eso significa que también debe establecer maxWorkerThreads y maxIoThreads. No necesitará configurar minFreeThreads o minLocalRequestFreeThreads si no está utilizando el modo clásico/ISAPI.

Cuestiones relacionadas