2009-08-12 15 views
1

Ich habe eine asp.net-Webseite, die 7 asynchrone Anfragen an einen WCF-Dienst auf einem anderen Server macht. Beide Boxen sind sauber, ohne dass etwas anderes installiert wurde.Wcf ThreadPool und async

Ich habe auch maxconnections in web.config bis 20.

erhöht ich einen einzigen Anruf durch das System und die Seite kehrt in 800ms laufen. Die lange und kurze Zeit ist, denke ich, dass der Threadpool überwältigt wird, sobald ich unterladen bin, kann ich nicht mehr als 8 Anfragen pro Sekunde bekommen, obwohl beide Quadcore-Boxen mit 20% CPU-Last und dem verbundenen SQL-Server laufen Die Anfragen werden in weniger als 10 ms pro Anruf zurückgegeben.

Ich habe das Dienstverhalten in Concurrency.multiple geändert, aber das scheint nicht zu helfen.

Irgendwelche Ideen jemand.

+0

per @Raphael, zusätzliche Informationen könnten ebenfalls helfen. Wie wird der Service gehostet? Welche Versionen von OS, .NET Framework? Welche Versionen von IIS usw.? –

Antwort

3

Es gibt viele verschiedene Faktoren, die hier im Spiel sein könnten. Ein Stich auf die Bemerkung, dass die Änderung Ihres Instanziierungsmodells auf dem Dienst null Wirkung hatte (große IF hier), dann ist es möglich, dass der "Engpass" dem Dienst vorgelagert ist. Entweder auf dem Webserver oder dem Client-Lastgenerator.

Sie haben mehrere Bereiche für die Optimierung zu überprüfen: Client, Webserver, WCF-Service-Server - vorausgesetzt, es gibt keine Netzwerkgeräte in der Mitte. Wähle ein Ende und arbeite in Richtung des anderen Endes. Da ich bereits davon ausgehe, dass es nicht der Service ist, würde ich beim Kunden anfangen und mich auf den Weg zum WCF-Service machen.

Client
Welche Maschine treibt die Last gegen den Webserver an? Ein Laptop? Ein Desktop? Ein dedizierter Test-Agent oder ein gemeinsamer? Der Client, der für diesen Test als Lastgenerator fungiert, ist ebenfalls anfällig für maxConnections Einschränkung, da dies eine Clienteinstellung ist.

Wie hoch ist die CPU-Auslastung des Clients, der die Last erzeugt? Könnte es sein, dass der Testtreiber gerade nicht in der Lage ist, genügend Last zu erzeugen, um diese Boxen zu pushen? Können Sie Ihrem Test weitere Testclients hinzufügen?

Web Server
Was bedeutet das system.net/processModel Element wie auf den ASP.NET-Webserver in machine.config aussehen? Versuchen Sie, autoConfig = true zu setzen. Dies ermöglicht die automatische Größenanpassung der Konfiguration basierend auf der "Größe" des Computers, auf dem sie ausgeführt wird.

WCF-Dienst
Bewertung WCF-Dienst für jegliche Drosselung Standardeinstellung, die in geeigneter Weise im Spiel und zwicken sein könnten. Siehe ServiceThrottlingBehavior auf MSDN.

Lassen Sie uns alle Änderungen im Verhalten wissen, die Sie (wenn überhaupt) beobachten können, wenn Sie irgendwelche Änderungen vornehmen!

0

Wird dieser Dienst in IIS, WAS oder einem Windows-Dienst gehostet?

Sie sollten versuchen, Windows so einzurichten, dass Dienste mit einer höheren Priorität ausgeführt werden. Ihr WCF-Dienst erstellt wahrscheinlich die benötigten Threads, sollte jedoch mit niedriger Priorität ausgeführt werden.

Hoffe, dass hilft.

1

Die wirkliche Antwort hier, dass jeder vermisst ist, dass Sie eine ASP.NET-Webseite verwenden.Das bedeutet, dass Ihr Client eine Art von Webbrowser ist. Moderne Web-Browser haben zu jeder Zeit ein Limit von 2 gleichzeitigen asynchronen Anfragen. Das bedeutet, dass 5 Ihrer Anfragen in der Warteschlange waren und darauf warteten, dass die ersten beiden fertig sind. Sobald die ersten zwei, diente es den nächsten zwei, dann die nächsten zwei, dann die letzte.

Alle diese Rundreisen und Handshakes nehmen sich einfach Zeit. Ich nehme an, dass Ihre Roundtrip-Zeit ungefähr 200ms beträgt, leider müssen Sie es viermal tun.

Ich mag auch nicht die "max 2" Browser-Beschränkung bei Webservice-Anrufe.

+0

Ihr Recht, der Standard ist, Clients auf zwei gleichzeitige Anforderungen zu beschränken. Dies kann jedoch überschrieben werden und sollte für Server-Anwendungen wahrscheinlich sein. @RubbleFord hat darauf hingewiesen, dass sie das bereits auf 20 gesetzt haben, weshalb es in Antworten nicht ausdrücklich genannt wird. Danke, dass Sie darauf hingewiesen haben. Ich habe dies in meiner Antwort hervorgehoben, um es klarer zu machen. Ihr wahrscheinlich bewusst, aber nur für den Fall, siehe http://msdn.microsoft.com/en-us/library/1tkaca2y.aspx. Vielen Dank! Z –

+0

Sie denken immer noch nicht an den Client als Browser, sondern als Anwendung. Der von Ihnen gepostete Link dient speziell zum Ändern der Konfigurationsdatei einer Anwendung, die Sie * für eine ASP.NET-Seite * nicht haben. Dies ist ein Fall, in dem IE strikt den Standards folgt - in diesem Fall RFC2616 , die HTTP1.1 abdeckt. Im RFC: Clients, die persistente Verbindungen verwenden, sollten die Anzahl der gleichzeitigen Verbindungen, die sie zu einem bestimmten Server pflegen, begrenzen. Ein Einzelbenutzer-Client SOLLTE NICHT mehr als 2 Verbindungen mit einem Server oder Proxy unterhalten. – JustLoren

+0

Ihr Recht und ich denke, wir sind beide richtig. Der Browser verfügt möglicherweise nicht über eine Konfigurationsdatei, die optimiert werden kann, um diese Einstellung zu umgehen. Die meisten Testagenten und Tools, die die Last für eine Webseite steuern, tun dies jedoch nicht über den Browser selbst, sondern auf der Protokollebene (http). Wenn dieser Testagent .NET-basiert ist (Visual Studio-Team-Test, benutzerdefinierter .net-Code usw.), wird er diesem Limit unterworfen, sofern er nicht geändert wird. Nach dieser Anfrage des Testagenten an die Website unterliegt die Anfrage von der Website an den Webservice ebenfalls einer Beschränkung, da die Site nun ein Client des Dienstes ist. –