Pregunta

Me encuentro con algunos problemas de rendimiento utilizando 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 '& Lt; tiempo de espera / > ' a la respuesta.

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

He jugado con una serie de configuraciones, pero lo único que he logrado es reducir el umbral de solicitud en el que se produce este error.

Aquí hay un resumen de las configuraciones con las que he jugado:

machine.config:

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

web.config:

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

Administrador IIS > ApplicationPools & Gt; Configuración avanzada

Queue Length : 65535

Aunque no puedo estar seguro, parece que esta configuración funciona bien si las solicitudes son sincrónicas, pero cuando estoy asíncrono, parece que no puedo superar más de 5000 solicitudes antes de que el servidor comience a decirme que me vaya. . Si configuro cosas más bajas (no recuerdo 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 una carga grave .

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

¿Hay algún tipo de & "; control de inundación &"; configurando en IIS que podría estar limitando un solo host a no más de 5000 solicitudes? ¿Cómo puedo hacer que IIS maneje más de 5000 solicitudes asíncronas concurrentes?

Edit2: ¿Hay contadores u otros indicadores de qué límite podría excederse, y cómo investigaría más a fondo?

Editar: Aquí está el código del generador de carga:

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));
            }

        }
    }
}
¿Fue útil?

Solución

OK. Solucionado ... muchas gracias a esta publicación por aclarar algunos detalles.

Para eliminar los errores 503 se requieren 3 cambios de configuración diferentes:

machine.config:

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

Administrador IIS > ApplicationPools & Gt; Configuración avanzada

Queue Length : 65535

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

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

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

10000 conexiones concurrentes, sin problemas. Gracias por la ayuda!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top