2009-07-22 9 views
6

Estoy en el proceso de solución de problemas de un servicio WCF que se cuelga en algún momento. El comportamiento en servicio es el siguiente:WCF: maxConcurrentCalls ha agotado

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

parámetros de limitación de peticiones son:

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

A continuación se presenta el estado del servicio tomado de un vertedero de colgar:

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) 

Como se puede ver, maxConcurrentCalls se ha agotado, mientras que el recuento de sesiones es solo de 9. Me pregunto si esto podría deberse a un mal funcionamiento en el código del cliente sobre el proxy uso, como el manejo de excepciones pobre?

Dado un vuelco de memoria del servicio, ¿hay alguna forma de encontrar las direcciones IP de los clientes?

TIA.

Respuesta

2

Encontrado el origen del problema. MaxConcurrentCalls se ha agotado debido a un interbloqueo en el código de servicio. Estamos usando la palabra clave de bloqueo C# y parece que a veces el bloqueo no se libera cuando ocurre algo extraño en el código protegido por el bloqueo ...

De todos modos, gracias a todos los que contribuyeron con este hilo.

+0

Hola, tengo un problema similar (consulte http://stackoverflow.com/questions/20842923/wcf-maxconcurrentsessions-exceeded). ¿Podría proporcionarme información adicional sobre su solución y la técnica de depuración? ¡Gracias! –

0

Esto podría ser una combinación de tiempo de espera y cómo está utilizando el proxy wcf/llamando al servicio wcf.

La idea es que cuando llame al servicio, no le dice al servicio que cierre, la conexión se mantendrá hasta que se agote el tiempo después de 10 minutos. Por lo tanto, puede hacer 10 llamadas por minuto que solo demoran 1 segundo, pero después de 10 minutos tiene 100 conexiones simultáneas.

El uso de una instrucción "using" para crear el proxy normalmente lo corrige.

+0

Al mirar los contadores de rendimiento, pude ver las instancias de ServiceModelService 3.0.0.0 en el punto final correspondiente. En la situación que describes, el recuento de instancias debería aumentar en cada nueva llamada y disminuir cada vez que se desconecta la conexión, ¿verdad? En mi caso, en circunstancias normales, el valor es alrededor de 0 y 1. Tengo hasta 1 llamada por segundo para el servicio. Tengo que esperar hasta que se reproduzca el probem y mirar los contadores. –

Cuestiones relacionadas