.net - configurar - Escribir un servicio WCF de larga duración
wcf service binding configuration (4)
¿IIS limita 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.
He estado escribiendo un servicio de larga votación en WCF. Estoy en el punto de prueba de carga y me encuentro con un problema que, cuando llego a las 5000 solicitudes pendientes, empiezo a obtener:
The HTTP service located at (my service) is too busy.
Implementé esto como un servicio WCF AsyncPattern y 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 hice:
Modifiqué el registro para que MaxConcurrentRequestsPerCPU no sea un problema. De hecho, el número de solicitudes en cola ASP.NET permanece 0.
Configuré la aceleración del 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).
Modifiqué machine.config para subir el requestQueueLimit: aquí está el elemento processModel de eso:
<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 todavía termino con este límite (la máquina en cuestión puede manejarlo y el resto del sistema vuelve a sincronizarse con un sistema de cola de mensajes).
¿Alguien puede pensar en otra cosa?
Soy IIS 7.5 en WindowsServer 2008R2. Asp.NET 3.5SP1.
Más información: Cuando obtengo 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 amplío los Procesos máximos de trabajo, puedo exceder las 5K solicitudes simultáneas.
De: 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 configure un DWORD
registro DWORD
@ HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/ASP.NET/2.0.50727.0/MaxConcurrentRequestsPerCPU = 5000.
Reinicie IIS
Para v3.5, puede establecer alternativamente <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 backend a través de 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, desde Application_Start
, por ejemplo. Establezca el valor en la cantidad de conexiones simultáneas de System.Net que espera que use su aplicación. Lo configuré 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á establecer minFreeThreads
o minLocalRequestFreeThreads
si no está utilizando el modo clásico / ISAPI.
Encuentro que las diferentes opciones de configuración son muy confusas, pero esta entrada de blog es muy útil:
http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx
Menciona un límite de 5000 en varias formas bastante. Lo complicado parece ser que se aplican diferentes configuraciones dependiendo de la configuración exacta (por ejemplo, .net 2, 3.5, 4.0, IIS 6, 7, etc.)
Espero que esto ayude.
Me encontré con el límite 5000 antes pero no puedo recordar dónde desafortunadamente.
¿Es esto alguna ayuda? http://msdn.microsoft.com/en-us/library/ee377061%28BTS.10%29.aspx
o
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/41aa5f44-ead6-47ba-8bd7-c918c9f0aee0/