Frage

Ich laufe in einige Performance-Problemen einen generischen Handler, die IHttpAsyncHandler implementiert. Im einfachsten Fall erhält der Handler eine GET-Anforderung, und 20 Sekunden später endet die Reaktion nach dem Schreiben ‚‘ auf die Antwort.

Wenn die .ashx mit 10000-20000 gleichzeitigen Anfragen Hämmer, schlägt es mit 503-Server nicht verfügbar, nachdem genau 5000 Anfragen. Wenn in dem Synchronmodus umgeschaltet, und die Anforderung sofort endet, das Problem verschwindet.

Ich habe mit einer Reihe von Einstellungen gebastelt, aber das einzige, was ich geschafft habe, ist niedriger acheive die Anforderung Schwellenwert, bei dem dieser Fehler auftritt.

Hier ist ein Überblick über die Einstellungen, die ich gespielt habe:

machine.config:

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

web.config:

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

IIS-Manager> ApplicationPools> Erweiterte Einstellungen

Queue Length : 65535

Obwohl ich nicht sicher sein kann, wie es scheint, wie diese Einstellungen funktionieren gut und in Ordnung, wenn die Anforderungen synchron sind, aber wenn async, kann ich nicht über genau 5000 Anfragen scheinen zu bekommen, bevor der Server beginnt mich zu sagen, weg zu gehen . Wenn ich Dinge niedriger eingestellt (nicht mehr genau, welche Einstellung, die von der oben sein würde, aber ich habe sie alle ausprobiert), dann ist die 503 Zählung entsprechend nach oben geht, aber ich kann es nie über 5000, wenn sie unter schwerer Last geschehe stoppen .

Es scheint, dass eine Reihe von Einstellungen gibt es in einer Vielzahl von Orten verstreut, die dies beeinflussen könnten, aber die 5000 ziemlich in Stein gemeißelt zu sein scheint. Ich sehe hier dass appRequestQueueLimit nicht 5000 übersteigen kann, kann aber keine weiteren Informationen zu dieser finden, und frage mich, ob diese Fehlinformation ist.

Gibt es eine Art „Hochwasserschutz“ in IIS Einstellung, die einen einzelnen Host nicht mehr als 5000 Anfragen könnte einschränkend? Wie kann ich IIS mehr, dass 5000 gleichzeitige asynchrone Anfragen bearbeiten?

Edit2: Gibt es irgendwelche Zähler oder andere Indikatoren, von denen Grenze könnte überschritten werden wird, und wie würde ich weiter untersuchen

?

Edit: Hier ist der loadgenerator Code:

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

        }
    }
}
War es hilfreich?

Lösung

OK. Feste ... vielen Dank an diese Post für ein paar Details Aufräumen.

Zur Beseitigung der 503 Fehler 3 verschiedene Konfigurationsänderungen erforderlich:

machine.config:

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

IIS-Manager> ApplicationPools> Erweiterte Einstellungen

Queue Length : 65535

und schließlich (das fehlende Stück des Puzzles), die Befehlszeile ein:

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

Die web.config Einstellung im Hauptpost erwähnt war irrelevant.

10000 gleichzeitige Verbindungen, keine Probleme. Vielen Dank für die Hilfe!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top