Ich habe einige Leistungsprobleme mit einem generischen Handler, der IHttpAsyncHandler implementiert. Im einfachsten Fall empfängt der Handler eine GET-Anforderung und 20 Sekunden später endet die Antwort, nachdem '< Timeout />' in die Antwort geschrieben wurde.IIS 7.0 503 Fehler mit generischem Handler (.ashx), der IHttpAsyncHandler implementiert
Beim Hämmern der .ashx mit 10000 bis 20000 gleichzeitige Anforderungen fehlschlägt es mit 503 Server nicht verfügbar nach genau 5000 Anforderungen. Wenn in den synchronen Modus gewechselt wird und die Anforderung sofort beendet wird, verschwindet das Problem.
Ich habe mit einer Reihe von Einstellungen gebastelt, aber das Einzige, was ich erreicht habe, ist, den Anforderungsschwellwert zu senken, bei dem dieser Fehler auftritt.
Hier ist ein Überblick über die Einstellungen, die ich mit 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, diese Einstellungen gut und gut funktionieren, wenn die Anforderungen synchron sind, aber wenn async, kann ich nicht über genau 5000 Anfragen zu bekommen scheint, bevor der Server beginnt zu erzählen Ich gehe weg. Wenn ich die Dinge etwas tiefer setze (ich kann mich nicht mehr genau erinnern, welche Einstellung von der oben genannten wäre, aber ich habe sie alle ausprobiert), dann steigt die 503-Zählung entsprechend, aber ich kann nie aufhören, dass es unter 5000 unter schwerer Last passiert .
Es scheint, dass dort eine Anzahl von Einstellungen in einer Vielzahl von Orten verstreut sind, die dies beeinflussen könnten, aber die 5000 scheint ziemlich in Stein gemeißelt. Ich sehe here, dass appRequestQueueLimit 5000 nicht überschreiten kann, aber kann keine weiteren Informationen darüber finden, und frage mich, ob dies Fehlinformationen ist.
Gibt es irgendeine Art von "Hochwasserschutz" Einstellung in IIS, die einen einzelnen Host auf nicht mehr als 5000 Anfragen begrenzen könnte? Wie kann ich IIS dazu bringen, mehr als 5000 gleichzeitige asynchrone Anforderungen zu behandeln?
Edit2: Gibt es Zähler oder andere Indikatoren, deren Grenzwert überschritten werden könnte, 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));
}
}
}
}
Danke für die Freigabe der Lösung, ich bekam den leeren weißen 503 Bildschirm des Todes, wenn eine Website eine Menge Verkehr hatte aus irgendeinem Grund, die Appcmd repariert es –