Question

Je rencontre des problèmes de performances avec un gestionnaire générique qui implémente IHttpAsyncHandler. Dans sa forme la plus simple, le gestionnaire reçoit une demande GET et, 20 secondes plus tard, termine la réponse après avoir écrit '& Lt; timeout / > ' à la réponse.

Lors du martelage du .ashx avec 10000-20000 requêtes simultanées, il échoue avec le serveur 503 indisponible après exactement 5000 requêtes. Lorsque vous passez en mode synchrone et que vous mettez immédiatement fin à la demande, le problème disparaît.

J'ai modifié plusieurs paramètres, mais la seule chose que j'ai réussi à obtenir est d'abaisser le seuil de demande auquel cette erreur se produit.

Voici un aperçu des paramètres avec lesquels j'ai joué:

machine.config:

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

web.config:

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

Gestionnaire IIS > ApplicationPools & Gt; Paramètres avancés

Queue Length : 65535

Bien que je ne sois pas sûr, il semble que ces paramètres fonctionnent correctement si les demandes sont synchrones, mais en mode async . Si je règle les choses plus bas (je ne me souviens pas exactement du réglage qui vient de ce qui précède, mais je les ai toutes essayées), le compte 503 augmente en conséquence, mais je ne peux jamais empêcher que cela se produise au-delà de 5 000 lorsque la charge est lourde. .

Il semble qu’il existe un certain nombre de paramètres dispersés dans une multitude de lieux susceptibles d’affecter ce phénomène, mais le 5000 semble bien figé. Je vois ici qui appRequestQueueLimit ne peut pas dépasser 5000, mais ne trouve aucune autre information à ce sujet et se demande s’il s’agit d’une information erronée.

Existe-t-il une sorte de " contrôle des inondations " paramètre dans IIS qui pourrait limiter un seul hôte à plus de 5000 demandes? Comment faire en sorte que IIS traite plus de 5000 requêtes asynchrones simultanées?

Modifier2: existe-t-il des compteurs ou d'autres indicateurs indiquant quelle limite pourrait être dépassée, et comment puis-je effectuer des recherches supplémentaires?

Éditer: Voici le code du générateur de charge:

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

        }
    }
}
Était-ce utile?

La solution

OK Corrigé ... Merci à ce message pour avoir clarifié quelques détails.

Pour éliminer les erreurs 503, 3 modifications de configuration différentes ont été nécessaires:

machine.config:

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

Gestionnaire IIS > ApplicationPools & Gt; Paramètres avancés

Queue Length : 65535

et enfin (la pièce manquante du puzzle), la ligne de commande:

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

Le paramètre web.config mentionné dans l'article principal n'était pas pertinent.

10000 connexions simultanées, pas de problèmes. Merci pour l'aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top