2009-07-22 10 views
6

Sono in fase di risoluzione dei problemi relativi a un servizio WCF che si blocca in un determinato momento. Il comportamento di servizio è il seguente:WCF: maxConcurrentCalls ha esaurito

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

parametri di limitazione sono:

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

seguito è lo stato di servizio preso da una discarica appendere:

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) 

Come si può vedere, maxConcurrentCalls ha esaurito, mentre il conteggio delle sessioni è solo 9. Mi chiedo se questo potrebbe essere causato da un malfunzionamento nel codice client su proxy utilizzo, come la scarsa gestione delle eccezioni?

Dato un dump della memoria del servizio, esiste un modo per trovare gli indirizzi IP dei client?

TIA.

risposta

2

Trovato l'origine del problema. MaxConcurrentCalls è esaurito a causa di un deadlock nel codice del servizio. Stiamo usando la parola chiave C# lock e sembra che a volte il blocco non venga rilasciato quando qualcosa di strano accade nel codice protetto dal blocco ...

In ogni caso, grazie a tutti coloro che hanno contribuito a questa discussione.

+0

Ciao, ho un problema simile (si veda http://stackoverflow.com/questions/20842923/wcf-maxconcurrentsessions-exceeded). Potresti fornirmi ulteriori informazioni sulla tua soluzione e sulla tecnica di debug? Grazie! –

0

Questa potrebbe essere una combinazione di timeout e il modo in cui si utilizza il proxy wcf/chiamando il servizio wcf.

L'idea è che quando si chiama il servizio, non si dice al servizio di chiudere, la connessione si bloccherà finché non scade dopo 10 minuti. Pertanto, è possibile effettuare 10 chiamate al minuto che richiedono solo 1 sec, ma dopo 10 minuti si hanno 100 connessioni simultanee.

L'utilizzo di un'istruzione "using" per creare il proxy normalmente lo risolve.

+0

Guardando i contatori delle prestazioni, ho potuto vedere ServiceModelService 3.0.0.0 Istanze sull'endpoint corrispondente. Nello scenario che descrivi, il conteggio delle istanze dovrebbe aumentare ad ogni nuova chiamata e diminuire ogni volta che la connessione scade, giusto? Nel mio caso, in circostanze normali, il valore è intorno a 0 e 1. Ho fino a 1 chiamata al secondo al servizio. Devo aspettare che il probema sia riprodotto e guardare i contatori. –

Problemi correlati