2016-10-18 1 views
0

Ich habe eine IIS-App; Beim Lasttest unserer App haben wir festgestellt, dass der Durchsatz sehr niedrig ist. Bei dem Versuch, das Problem zu beheben, führten wir einen Testlauf durch, bei dem eine Seite getestet wurde, die ungefähr 1000 Byte statischer Daten mit einem Ruhezustand im Controller zurückgab. Was wir finden, ist, dass, wenn die Schlafdauer etwa 1 Sekunde ist, IIS keine Anfragen innerhalb von 1 Sekunde bei Lasten von mehr als 10 Rps ausführen kann.IIS: Kann keinen hohen Durchsatz erreichen

Jetzt lese ich über die Concurrent Requests und wie post. Net 4.5, der Standardwert ist 5000. Also, wenn IIS 5000 gleichzeitige Anfragen behandelt, wie kommt es, ist es nicht möglich, Anforderungen mit 10 rps zu dienen, mit jeder Anfrage 1 zweite? Mathe summiert sich nicht.

Beachten Sie, dass statische Daten zurückgegeben werden, Datengröße ist klein, und alle Funktionen tun zu schlafen ist. Also keine der Maschinenparametern wie CPU, Festplatte, Netzwerk usw. überschreiten Limit. Der Server blinkt kaum.

Dies ist der gesamte Controller-Code

public ActionResult Contact() 
{ 
    Thread.Sleep(1000); 
    return View(); 
} 

Der Blick in dort einige statische HTML zurückgibt; Ich habe die Web-App mit der Visual Studio-Vorlage erstellt. Die Vorlage gibt statisches HTML zurück.

Wenn ich den Schlaf entfernen, habe ich kein Problem, den Server mit hohen RPS zu laufen. Aber dann sind die Anforderungen so schnell erledigt, dass IIS selbst bei hohen RPS keine hohe Parallelität mehr erfahren würde.

Antwort

0

Gehören alle Anfragen zur selben Sitzung? Wenn ja, gibt this post die Ursache des Problems an.

Im Wesentlichen stellt sich heraus, dass die ASP.NET-Sitzung nicht Thread-sicher ist und Sie keine parallelen Anforderungen von derselben Sitzung haben können. ASP.NET serialisiert die Aufrufe einfach und führt sie sequenziell aus. Dies führt zu der Blockierung, die Sie sehen, wenn Sie Thread.Sleep() aufrufen.

Wenn die Anforderungen von verschiedenen Sitzungen kommen, sollte es keine Blockierung geben. In jedem Fall können Sie versuchen, die Sitzungen turining aus:

<sessionState mode="Off" /> 
+0

ich ein einfaches C# Lasttest-Programm habe HttpWebResponse objWebResponse = (HttpWebResponse) objRequest.GetResponse(); Welches von mehreren Threads aufgerufen wird, um die gewünschte Last zu erhalten. Keine explizite Sitzungserstellung Würde dies zu derselben Sitzung in IIS führen? Da ich keine Sitzungsinformationen zurücksende, denke ich nicht. – Amit

+0

Sofern nicht anders angegeben, gibt es eine Sitzungs-ID, die in der Antwort als Cookie zurückgesendet wird. Wenn nachfolgende Anfragen diesen Cookie senden, behandelt ASP.NET sie alle als Teil derselben Sitzung. Es wäre einen Versuch wert, den Sitzungsstatus auszuschalten und zu sehen, ob das in Ihrem Fall funktioniert. – Connor

+0

Ich werde das versuchen; aber wir senden KEINE Cookies über diesen Lastgenerator zurück. – Amit

Verwandte Themen