2009-03-04 20 views
7

Tengo algunos problemas de rendimiento con un controlador genérico que implementa IHttpAsyncHandler. En su forma más simple, el controlador recibe una solicitud GET, y 20 segundos después finaliza la respuesta después de escribir '< timeout />' a la respuesta.IIS 7.0 503 errores con controlador genérico (.ashx) que implementa IHttpAsyncHandler

Cuando se ejecuta el .ashx con solicitudes simultáneas de 10000-20000, falla con el servidor 503 no disponible después de precisamente 5000 solicitudes. Al cambiar al modo síncrono y finalizar la solicitud de inmediato, el problema desaparece.

He modificado varias configuraciones, sin embargo, lo único que he conseguido es reducir el umbral de solicitud en el que se produce este error.

He aquí un resumen de los ajustes que he jugué con:

machine.config:

<configuration> 
    ... 
    <system.web> 
     ... 
     <processModel enable="true" requestQueueLimit="10000"/> 
     ... 

web.config:

<configuration> 
    ... 
    <system.web> 
     ... 
     <httpRuntime enable="true" appRequestQueueLimit="10000"/> 
     ... 

Administrador de IIS> ApplicationPools> Configuración avanzada

Queue Length : 65535 

Aunque no puedo estar seguro, parece que estos ajustes funcionan bien y el bien si las peticiones son síncronos, pero cuando asíncrono, me parece que no puede ir más allá de exactamente 5.000 solicitudes para que el servidor comienza a contar yo para irme Si configuro las cosas más bajas (no puedo recordar exactamente qué configuración sería la anterior, pero las he probado todas), entonces el recuento de 503 aumenta en consecuencia, pero nunca puedo evitar que suceda más allá de 5000 cuando está bajo carga seria .

Parece que hay una serie de configuraciones dispersas en una gran cantidad de lugares que podrían afectar esto, pero el 5000 parece bastante inamovible. Veo here que appRequestQueueLimit no puede exceder 5000, pero no puedo encontrar más información sobre esto, y me pregunto si esto es información errónea.

¿Existe algún tipo de configuración de "control de inundación" en IIS que pueda estar limitando un único host a no más de 5000 solicitudes? ¿Cómo puedo hacer que IIS maneje más de 5000 solicitudes asincrónicas simultáneas?

Edit2: ¿Hay algún contador u otro indicador de cuál límite se puede exceder, y cómo voy a investigar más?

Editar: Aquí está el código loadgenerator:

using System; 
using System.Net; 
using System.Threading; 

namespace HammerTime 
{ 
    class Program 
    { 
     private static int counter = 0; 
     static void Main(string[] args) 
     { 
      var limit = 5000; 
      ServicePointManager.DefaultConnectionLimit=limit; 
      for (int i = 0; i < limit;++i) 
      { 
       StartWebRequest(i.ToString()); 

      } 
      Console.ReadLine(); 
     } 

     private static void StartWebRequest(string channelId) 
     { 
      string uri = "http://spender2008/test/Test.ashx?channel="+channelId; 
      HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri); 
      request.BeginGetResponse(responseHandler, request); 
     } 

     private static void responseHandler(IAsyncResult ar) 
     { 
      try 
      { 
       HttpWebRequest state = (HttpWebRequest)ar.AsyncState; 
       HttpWebResponse response = (HttpWebResponse)state.EndGetResponse(ar); 

      } 
      catch(Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
      finally 
      { 
       Console.WriteLine(Interlocked.Increment(ref counter)); 
      } 

     } 
    } 
} 

Respuesta

5

OK. Corregido ... muchas gracias a la publicación this para aclarar algunos detalles.

para eliminar el 503 errores requiere 3 cambios de configuración diferentes:

máquina.config:

<configuration> 
    ... 
    <system.web> 
     ... 
     <processModel enable="true" requestQueueLimit="100000"/> 

Administrador de IIS> ApplicationPools> Configuración avanzada

Queue Length : 65535 

y finalmente (la pieza faltante del rompecabezas), la línea de comandos:

appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000 

La Web La configuración .config mencionada en la publicación principal era irrelevante.

10000 conexiones simultáneas, sin problemas. ¡Gracias por la ayuda!

+0

Gracias por compartir la solución, estaba obteniendo la pantalla de muerte blanca en blanco 503 cuando un sitio tenía mucho tráfico por alguna razón, la aplicación lo arregló –

Cuestiones relacionadas