2009-07-22 8 views
6

Ich bin gerade dabei, einen WCF-Dienst zu beheben, der irgendwann hängen bleibt. Das Betriebsverhalten ist die folgende:WCF: maxConcurrentCalls ist erschöpft

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 

Throttling Parameter sind:

<serviceThrottling maxConcurrentCalls="50" maxConcurrentSessions="50" maxConcurrentInstances="50" /> 

Nach der Service Zustand von einem Hang Dump genommen:

0:000> !mdt 0000000000c9f270 -r 
0000000000c9f270 (System.ServiceModel.Dispatcher.ServiceThrottle) 
    calls:0000000000c9f3d8 (System.ServiceModel.Dispatcher.FlowThrottle) 
     capacity:0x32 (System.Int32) 
     count:0x32 (System.Int32) 
     mutex:0000000000c9f418 (System.Object) 
     <NO FIELDS> 
     release:0000000000c9f398 (System.Threading.WaitCallback) 
     _target:0000000000c9f270 (System.ServiceModel.Dispatcher.ServiceThrottle) 
      <RECURSIVE> 
     _methodBase:NULL (System.Reflection.MethodBase) 
     _methodPtr:0000064273dddf30 (System.IntPtr) 
     _methodPtrAux:0000000000000000 (System.IntPtr) 
     _invocationList:NULL (System.Object) 
     _invocationCount:0000000000000000 (System.IntPtr) 
     <NO FIELDS> 
     waiters:0000000000c9f430 (System.Collections.Generic.Queue`1[[System.Object, mscorlib]]) 
     _array:0000000028d73e70 (System.Object[], Elements: 16) 
     _head:0x1 (System.Int32) 
     _tail:0xA (System.Int32) 
     _size:0x9 (System.Int32) 
     _version:0x22 (System.Int32) 
     _syncRoot:NULL (System.Object) 
     propertyName:0000000000c9f2b8 (System.String: "MaxConcurrentCalls") 
     configName:0000000000c9f358 (System.String: "maxConcurrentCalls") 
    sessions:0000000000c9f508 (System.ServiceModel.Dispatcher.FlowThrottle) 
     capacity:0x32 (System.Int32) 
     count:0x9 (System.Int32) 

.... 

    instanceContexts:000000000105ffc8 (System.ServiceModel.Dispatcher.FlowThrottle) 
     capacity:0x32 (System.Int32) 
     count:0x32 (System.Int32) 

Wie Sie sehen können, maxConcurrentCalls hat erschöpft, während Sitzungen zählen nur 9 ist. Ich frage mich, ob dies durch eine Fehlfunktion in Client-Code über Proxy verursacht werden könnte Nutzung, wie schlechte Ausnahmebehandlung?

Angesichts eines Speicherabzugs des Dienstes, gibt es eine Möglichkeit, Client-IP-Adressen zu finden?

TIA.

Antwort

2

Die Ursache des Problems gefunden. MaxConcurrentCalls ist aufgrund eines Deadlocks im Servicecode erschöpft. Wir verwenden das Schlüsselwort C# lock und es scheint, dass manchmal die Sperre nicht freigegeben wird, wenn etwas seltsames passiert in dem durch das Schloss geschützten Code ...

Jedenfalls, danke an alle, die zu diesem Thread beigetragen haben.

+0

Hallo, ich habe ein ähnliches problema (siehe http://stackoverflow.com/questions/20842923/wcf-maxconcurrentsitzungen-exceeded). Könnten Sie mir zusätzliche Informationen über Ihre Lösung und Debugging-Technologie zur Verfügung stellen? Vielen Dank! –

0

Dies könnte eine Kombination aus Timeout und wie Sie den wcf-Proxy verwenden/den Aufruf des WCF-Service.

Idee ist, dass wenn Sie den Dienst anrufen, Sie nicht sagen, der Dienst zu schließen, wird die Verbindung dann bis herum hängen, bis es nach 10 Minuten abläuft. Daher können Sie 10 Anrufe pro Minute tätigen, die nur 1 Sekunde dauern, aber nach 10 Minuten haben Sie 100 gleichzeitige Verbindungen.

Die Verwendung einer "using" -Anweisung, um den Proxy zu erstellen, behebt dies normalerweise.

+0

Mit Blick auf die Leistungsindikatoren konnte ich ServiceModelService 3.0.0.0 Instanzen auf dem entsprechenden Endpunkt sehen. In dem Szenario, das Sie beschreiben, sollte die Anzahl der Instanzen bei jedem neuen Aufruf erhöht und jedes Mal, wenn die Verbindung abläuft, verringert werden, oder? In meinem Fall ist der Wert unter normalen Umständen um 0 und 1. Ich habe bis zu 1 Anruf pro Sekunde an den Dienst. Ich muss warten, bis das Problem reproduziert ist, und auf die Zähler schauen. –

0

Ich vermute es liegt daran, dass Sie Clients mit Blöcken erstellen erstellen. Siehe What is the best workaround for the WCF client `using` block issue?

+0

Hallo, ich habe ein ähnliches Problem (siehe http://stackoverflow.com/questions/20842923/wcf-maxconcurrentsitzungen-exceeded). Könnten Sie einige zusätzliche Informationen bereitstellen? Vielen Dank! –

Verwandte Themen