IIS 7.0 503 erreurs génériques gestionnaire (.ashx) la mise en œuvre de IHttpAsyncHandler

Je suis en cours d'exécution dans certains problèmes de performances à l'aide d'un générique gestionnaire qui implémente IHttpAsyncHandler. Dans sa plus simple expression, le gestionnaire reçoit une requête GET, et 20 secondes plus tard, se termine la réponse après avoir écrit '< timeout />' pour la réponse.

Lorsque le martelage de la .ashx avec 10000-20000 demandes simultanées, il échoue avec 503 serveur indisponible après précisément 5000 demandes. Lors de la commutation en mode synchrone, et se terminant immédiatement la demande, le problème disparaît.

J'ai bricolé avec un certain nombre de paramètres, mais la seule chose que j'ai réussi à réaliser est inférieur à la demande seuil à partir duquel cette erreur se produit.

Voici les paramètres que j'ai joué avec:

de la machine.config:

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

web.config:

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

Gestionnaire des services IIS > ApplicationPools > Paramètres Avancés

Queue Length : 65535

Bien que je ne peux pas être sûr, il semble que ces paramètres sont bons et beaux-si les demandes sont synchrones, mais quand async, je n'arrive pas à aller au-delà exactement 5000 demandes avant que le serveur commence à me dire d'aller loin. Si j'ai mis les choses inférieur (ne me souviens pas exactement qui milieu qui serait à partir de ci-dessus, mais je les ai tous essayés), puis le 503 comte monte en conséquence, mais je ne peux jamais arrêter ce qui se passe au-delà de 5000 sous charge sérieuse.

Il semble qu'il y a un certain nombre de paramètres dispersés dans une multitude de lieux qui pourraient influer sur le présent, mais l'5000 semble assez figé dans la pierre. Je vois ici que appRequestQueueLimit ne peut pas dépasser les 5000, mais ne trouve pas plus d'info à ce sujet, et je me demande si c'est de la désinformation.

Est-il une sorte de "contrôle des inondations" dans IIS qui pourrait être un facteur limitant à un seul hôte à pas plus de 5000 demandes? Comment puis-je obtenir IIS pour gérer plus de 5000 simultanées des requêtes asynchrones?

Edit2: existe-il des compteurs ou d'autres indicateurs de ce qui limite peut être dépassée, et comment pourrais-je étudier?

Edit: Voici le 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));
}
}
}
}

OriginalL'auteur spender | 2009-03-04