IIS 7.0 503 erros com manipulador genérico (.ashx) implementar IHttpAsyncHandler
-
03-07-2019 - |
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 '
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));
}
}
}
}
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!