Domanda

Sto riscontrando alcuni problemi di prestazioni utilizzando un gestore generico che implementa IHttpAsyncHandler. Nella sua forma più semplice, il gestore riceve una richiesta GET e dopo 20 secondi termina la risposta dopo aver scritto '& Lt; timeout / > ' alla risposta.

Quando si martella il .ashx con 10000-20000 richieste simultanee, fallisce con 503 server non disponibile dopo precisamente 5000 richieste. Quando si passa alla modalità sincrona e si termina immediatamente la richiesta, il problema scompare.

Ho armeggiato con una serie di impostazioni, ma l'unica cosa che sono riuscito a raggiungere è abbassare la soglia di richiesta alla quale si verifica questo errore.

Ecco una carrellata delle impostazioni con cui ho giocato:

machine.config:

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

web.config:

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

Gestione IIS > ApplicationPools & Gt; Impostazioni avanzate

Queue Length : 65535

Anche se non posso esserne sicuro, sembra che queste impostazioni funzionino bene se le richieste sono sincrone, ma quando sono asincrone, non riesco a superare esattamente le 5000 richieste prima che il server inizi a dirmi di andare via . Se imposto le cose più in basso (non ricordo esattamente quale impostazione sarebbe da sopra, ma le ho provate tutte), allora il conteggio 503 aumenta di conseguenza, ma non riesco mai a smettere che accada oltre 5000 quando sotto carico grave .

Sembra che ci siano un certo numero di impostazioni sparse in una miriade di luoghi che potrebbero influenzare questo, ma il 5000 sembra abbastanza incastonato nella pietra. Vedo qui quell'appRequestQueueLimit non può superare 5000, ma non è possibile trovare ulteriori informazioni al riguardo e chiedersi se si tratti di disinformazione.

Esiste un tipo di " flood-control " impostazione in IIS che potrebbe limitare un singolo host a non più di 5000 richieste? Come posso ottenere IIS per gestire più di 5000 richieste asincrone simultanee?

Modifica2: ci sono contatori o altri indicatori di cui potrebbe essere superato il limite e come approfondire ulteriormente?

Modifica: ecco il codice 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));
            }

        }
    }
}
È stato utile?

Soluzione

OK. Risolto ... molte grazie a questo post per chiarire alcuni dettagli.

Per eliminare i 503 errori richiesti 3 diverse modifiche alla configurazione:

machine.config:

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

Gestione IIS > ApplicationPools & Gt; Impostazioni avanzate

Queue Length : 65535

e infine (il pezzo mancante del puzzle), la riga di comando:

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

L'impostazione web.config menzionata nel post principale era irrilevante.

10000 connessioni simultanee, nessun problema. Grazie per l'aiuto!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top