2009-04-07 5 views
0

Ich versuche, einen ASP.NET-Webdienst zu erstellen, mit dem ich den Unterschied zwischen der asynchronen oder der asynchronen Implementierung einer Webmethode anzeigen kann. Es ist eine Art Proof-of-Concept, mit dem ich zeigen kann, wie das asynchrone Schreiben von Dingen eine App skalierbarer macht. Um den Vergleich durchzuführen, habe ich zwei Methoden implementiert: RunSqlSync und RunSqlAsync. Wie folgt aus:Führt IIS oder ASP.NET irgendeine Art von Verbindungsdrosselung durch?

[WebMethod] 
public int RunSqlSync(string sql) 
{ 
    // call SQL synchronously 
} 

[WebMethod] 
public IAsyncResult BeginRunSqlAsync(string sql, AsyncCallback callback, object state) 
{ 
    // call SQL asynchronously 
} 

[WebMethod] 
public int EndRunSqlAsync(IAsyncResult result) 
{ 

} 

Ich würde erwarten, dass ich mehr gleichzeitigen Anfragen zu verarbeiten, wäre in der Lage durch die Async-Version der Methoden verwenden, vor allem, wenn der SQL-Aufruf eine Weile dauerte. Leider scheint es für beide Methoden so zu sein, dass ich ein Limit von Request/Sec (das Limit hängt von der Latenz der SQL-Aufrufe) erreicht habe und ich bin nicht einmal annähernd dabei, meine CPU zu maximieren. Wenn ich die Anzahl der Anforderungen, die an den Web-Service gesendet werden, erhöhe (indem ich die Anzahl der Benutzer in meinem Ocracoke Load Test erhöht), steigt die durchschnittliche Antwortzeit nur an, ohne den tatsächlichen TPS-Durchsatz zu ändern. Ich habe den Web Service intern instrumentiert, um die Zeit zu messen, die für die Ausführung einer Anfrage benötigt wird, und innerhalb meines Codes wird jede einzelne Anfrage unabhängig von der Last zur gleichen Zeit bearbeitet. Das lässt mich denken, dass ASP.NET irgendwie Drosselung ist. Weiß jemand, warum das passieren würde?

Antwort

2

Sie können die maximale Poolgröße im .Net SQL-Verbindungszeichenfolgeaufruf festlegen. Ich glaube, der Standard ist 20 Verbindungen maximal, also wenn Sie das schlagen dann würde es nur zulassen, dass diejenigen verwendet werden und im Wesentlichen würden Sie die gleichen Ergebnisse erhalten. Hier finden Sie einen Artikel zum Verbindungs-Pooling.

http://www.15seconds.com/Issue/040830.htm

+1

In .NET 4.0/4.5, die Standard-Max Pool Size ist 100. – RickNZ

+0

Link tot ist jetzt –

1

Wie schwig sagte, sind Sie wahrscheinlich nicht in eine Bandbreitenbegrenzung ausgeführt wird, sind Sie wahrscheinlich in Ihrem Prozess aus der Worker-Threads ausgeführt wird. Hier ist das Kapitel, das Sie von MS lesen sollten, die ich finden aufschlussreich sein:

http://msdn.microsoft.com/en-us/library/ms998549.aspx