Pergunta

Eu estou correndo em alguns problemas de desempenho usando um manipulador genérico que implementa IHttpAsyncHandler. Na sua forma mais simples, o condutor recebe um pedido GET, e 20 segundos depois termina a resposta depois de escrever '' para a resposta.

Quando martelando a .ashx com 10000-20000 solicitações simultâneas, ele falha com 503 servidor após indisponíveis precisamente 5000 pedidos. Ao alternar para o modo síncrono, e terminando imediatamente o pedido, o problema desaparece.

Eu já consertou com um número de configurações, mas a única coisa que eu consegui acheive é diminuir o limiar pedido em que ocorre este erro.

Aqui está um resumo das configurações que eu brincava com:

machine.config:

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

web.config:

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

Gerenciador de IIS> applicationPools> Configurações avançadas

Queue Length : 65535

Embora eu não posso ter certeza, parece que estas configurações de trabalho bom e bem se os pedidos são síncronas, mas quando assíncrona, eu não consigo ir além exatamente 5000 pedidos antes que o servidor começa a dizer-me para ir embora . Se eu definir as coisas diminuir (não lembro exatamente qual a definição que seria a partir do acima, mas eu tentei todos eles), então a contagem de 503 sobe em conformidade, mas eu nunca pode impedir que isso aconteça para além de 5000, quando sob carga séria .

Parece que há um número um das configurações espalhadas em uma infinidade de lugares que possam afectar esta, mas o 5000 parece bastante definido em pedra. Vejo aqui que appRequestQueueLimit não pode exceder 5000, mas pode encontrar mais nenhuma informação sobre isso, e me pergunto se isso é desinformação.

Existe algum tipo de "flood-control" configuração no IIS que pode ser um fator limitante um único anfitrião a não mais de 5000 pedidos? Como posso obter IIS para lidar com mais de 5000 solicitações assíncronas simultâneas?

Edit2:? Existem contadores ou outros indicadores de que limite pode ser ser ultrapassado, e como eu ia investigar mais

Edit: Aqui está o 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));
            }

        }
    }
}
Foi útil?

Solução

OK. Corrigido ... muito obrigado a este post para esclarecer alguns detalhes.

Para eliminar os erros 503 necessários 3 alterações de configuração diferentes:

machine.config:

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

Gerenciador de IIS> applicationPools> Configurações avançadas

Queue Length : 65535

e finalmente (a peça que faltava do quebra-cabeça), a linha de comando:

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

A configuração web.config mencionado no post principal era irrelevante.

10000 conexões simultâneas, sem problemas. Obrigado pela ajuda!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top