appfabric appfabric-cache

Solución de problemas de escalamiento de AppFabric(código de error intermitente<ERRCA0017>: subestado<ES0006> errores)



appfabric-cache (3)

  1. ¿Ha instalado http://support.microsoft.com/kb/983182 y http://support.microsoft.com/kb/2527387 ?
  2. ¿En su código verifica la excepción y el bool retrylater?

    catch (DataCacheException ex2) { if (ex2.ErrorCode == DataCacheErrorCode.RetryLater) {

    El uso de una región con nombre obliga al servidor a enviar los valores de esa región con nombre a un solo servidor en lugar de distribuir los hashes en todos los servidores de caché. ("Para proporcionar esta funcionalidad de búsqueda adicional, los objetos en una región están limitados a un único host de caché". http://msdn.microsoft.com/en-us/library/ee790985(v=azure.10).aspx )

Lo que recomendaría es que comparta su región con nombre en 2 servidores más y los coloque en un clúster. De esta manera, está limitando las excepciones a un servidor más pequeño cuando ejecuta el GC e intenta encontrar más ram para colocar y almacenar objetos y etiquetas.

Hemos implementado AppFabric Windows Server Cache para nuestra aplicación web. Inicialmente, pudimos usar el caché sin ningún problema. Luego aumentamos el tráfico aproximadamente 100 veces y comenzamos a experimentar excepciones intermitentes. Las excepciones se producen aproximadamente una vez cada 2 días, durante aproximadamente un minuto cada vez.

Nuestra configuración:

  • 9 servidores web que insertan / recuperan objetos en caché:
    • Objetos de tipo operativo de 500 bytes en su mayoría temporales
    • Usando 1 región nombrada
    • Objetos almacenados con etiquetas.
    • Recuperado a granel para una etiqueta dada
  • Cluster de caché:
    • 1 host (principal) AppFabric 1.1 (la versión reportada por get-cachehost es 3)
    • Proveedor de configuracion SQL
    • 96 GB de RAM en el host, el 50% predeterminado (48 GB) asignado a AppFabric
    • Config host de caché
    • Config cliente de caché

Los errores en el orden en que ocurren (las excepciones se producen para cada uno de los nueve servidores web durante el período de 1 minuto):

  • System.Net.Sockets.SocketException: una conexión existente fue cerrada por la fuerza por el host remoto Microsoft.ApplicationServer.Caching.DataCacheException: ErrorCode<ERRCA0016>:SubStatus<ES0001>:The connection was terminated, possibly due to server or network problems or serialized Object size is greater than MaxBufferSize on server. Result of the request is unknown. ---> System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was ''00:15:00''. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host --- End of inner exception stack trace --- at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result) at System.ServiceModel.Channels.FramingDuplexSessionChannel.EndReceive(IAsyncResult result) at Microsoft.ApplicationServer.Caching.WcfClientChannel.CompleteProcessing(IAsyncResult result) --- End of inner exception stack trace --- at Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ResponseBody respBody) at Microsoft.ApplicationServer.Caching.DataCache.GetNextBatch(String region, DataCacheTag[] tags, GetByTagsOperation op, IMonitoringListener listener, Byte[][]& state, Boolean& more) at Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator''2.MoveNext() at System.Linq.Enumerable.<ExceptIterator>d__99''1.MoveNext() at System.Collections.Generic.List''1..ctor(IEnumerable''1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable''1 source) ErrorCode<ERRCA0016>:SubStatus<ES0001>:The connection was terminated, possibly due to server or network problems or serialized Object size is greater than MaxBufferSize on server. Result of the request is unknown. ---> System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was ''00:15:00''. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host --- End of inner exception stack trace --- at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result) at System.ServiceModel.Channels.FramingDuplexSessionChannel.EndReceive(IAsyncResult result) at Microsoft.ApplicationServer.Caching.WcfClientChannel.CompleteProcessing(IAsyncResult result) --- End of inner exception stack trace --- at Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ResponseBody respBody) at Microsoft.ApplicationServer.Caching.DataCache.GetNextBatch(String region, DataCacheTag[] tags, GetByTagsOperation op, IMonitoringListener listener, Byte[][]& state, Boolean& more) at Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator''2.MoveNext() at System.Linq.Enumerable.<ExceptIterator>d__99''1.MoveNext() at System.Collections.Generic.List''1..ctor(IEnumerable''1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable''1 source)

  • Microsoft.ApplicationServer.Caching.DataCacheException: ErrorCode<ERRCA0017>:SubStatus<ES0006>:There is a temporary failure. Please retry later. (One or more specified cache servers are unavailable, which could be caused by busy network or servers. For on-premises cache clusters, also verify the following conditions. Ensure that security permission has been granted for this client account, and check that the AppFabric Caching Service is allowed through the firewall on all cache hosts. Also the MaxBufferSize on the server must be greater than or equal to the serialized object size sent from the client.) at Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ResponseBody respBody) at Microsoft.ApplicationServer.Caching.DataCache.GetNextBatch(String region, DataCacheTag[] tags, GetByTagsOperation op, IMonitoringListener listener, Byte[][]& state, Boolean& more) at Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator''2.MoveNext() at System.Linq.Enumerable.<ExceptIterator>d__99''1.MoveNext() at System.Collections.Generic.List''1..ctor(IEnumerable''1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable''1 source) ErrorCode<ERRCA0017>:SubStatus<ES0006>:There is a temporary failure. Please retry later. (One or more specified cache servers are unavailable, which could be caused by busy network or servers. For on-premises cache clusters, also verify the following conditions. Ensure that security permission has been granted for this client account, and check that the AppFabric Caching Service is allowed through the firewall on all cache hosts. Also the MaxBufferSize on the server must be greater than or equal to the serialized object size sent from the client.) at Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ResponseBody respBody) at Microsoft.ApplicationServer.Caching.DataCache.GetNextBatch(String region, DataCacheTag[] tags, GetByTagsOperation op, IMonitoringListener listener, Byte[][]& state, Boolean& more) at Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator''2.MoveNext() at System.Linq.Enumerable.<ExceptIterator>d__99''1.MoveNext() at System.Collections.Generic.List''1..ctor(IEnumerable''1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable''1 source)

  • Microsoft.ApplicationServer.Caching.DataCacheException: ErrorCode<ERRCA0018>:SubStatus<ES0001>:The request timed out. at Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ResponseBody respBody) at Microsoft.ApplicationServer.Caching.DataCache.GetNextBatch(String region, DataCacheTag[] tags, GetByTagsOperation op, IMonitoringListener listener, Byte[][]& state, Boolean& more) at Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator''2.MoveNext() at System.Linq.Enumerable.<ExceptIterator>d__99''1.MoveNext() at System.Collections.Generic.List''1..ctor(IEnumerable''1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable''1 source) ErrorCode<ERRCA0018>:SubStatus<ES0001>:The request timed out. at Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ResponseBody respBody) at Microsoft.ApplicationServer.Caching.DataCache.GetNextBatch(String region, DataCacheTag[] tags, GetByTagsOperation op, IMonitoringListener listener, Byte[][]& state, Boolean& more) at Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator''2.MoveNext() at System.Linq.Enumerable.<ExceptIterator>d__99''1.MoveNext() at System.Collections.Generic.List''1..ctor(IEnumerable''1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable''1 source)

También hemos creado una sesión de registro en el servidor de almacenamiento en caché para capturar más información para diagnosticar el problema. Cualquier sugerencia sobre cómo analizar esto sería apreciada (puedo hacer que esté disponible si es necesario).

También supervisamos varios contadores de rendimiento de AppFabric, CLR y Red, a continuación se muestra una captura de pantalla del evento a medida que ocurre:

Gracias de antemano por cualquier idea o consejo que pueda compartir sobre la resolución de este problema.

ACTUALIZACIÓN 1

Las siguientes son las excepciones que ocurren continuamente en el servidor de almacenamiento en caché de AppFabric durante los errores intermitentes (extraídos de registros de rastreo):

  • System.ServiceModel.CommunicationException: The socket connection was aborted because an asynchronous send to the socket did not complete within the allotted timeout of 00:00:00.0082078. The time allotted to this operation may have been a portion of a longer timeout. ---> System.ObjectDisposedException: The socket connection has been disposed. Object name: ''System.ServiceModel.Channels.SocketConnection''. --- End of inner exception stack trace --- at System.ServiceModel.Channels.SocketConnection.ThrowIfNotOpen() at System.ServiceModel.Channels.SocketConnection.BeginRead(Int32 offset, Int32 size, TimeSpan timeout, WaitCallback callback, Object state) at System.ServiceModel.Channels.SessionConnectionReader.BeginReceive(TimeSpan timeout, WaitCallback callback, Object state) at System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.PerformOperation(TimeSpan timeout) at System.ServiceModel.Channels.SynchronizedMessageSource.SynchronizedAsyncResult''1..ctor(SynchronizedMessageSource syncSource, TimeSpan timeout, AsyncCallback callback, Object state) at System.ServiceModel.Channels.FramingDuplexSessionChannel.BeginReceive(TimeSpan timeout, AsyncCallback callback, Object state) at Microsoft.ApplicationServer.Caching.WcfServerChannel.CompleteProcessing(IAsyncResult result)

  • System.ServiceModel.CommunicationObjectAbortedException: The communication object, System.ServiceModel.Channels.ServerSessionPreambleConnectionReader+ServerFramingDuplexSessionChannel, cannot be used for communication because it has been Aborted. at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result) at System.ServiceModel.Channels.FramingDuplexSessionChannel.OnEndSend(IAsyncResult result) at Microsoft.ApplicationServer.Caching.ReplyContext.EndSend(IAsyncResult result)

  • System.ServiceModel.CommunicationObjectFaultedException: The communication object, System.ServiceModel.Channels.ServerSessionPreambleConnectionReader+ServerFramingDuplexSessionChannel, cannot be used for communication because it is in the Faulted state. at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen() at System.ServiceModel.Channels.OutputChannel.Send(Message message, TimeSpan timeout) at Microsoft.ApplicationServer.Caching.ReplyContext.Reply(Message message, TimeSpan timeout)

  • System.TimeoutException: Sending to via http://www.w3.org/2005/08/addressing/anonymous timed out after 00:00:15. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: Cannot claim lock within the allotted timeout of 00:00:15. The time allotted to this operation may have been a portion of a longer timeout. --- End of inner exception stack trace --- at System.ServiceModel.Channels.FramingDuplexSessionChannel.OnSend(Message message, TimeSpan timeout) at System.ServiceModel.Channels.OutputChannel.Send(Message message, TimeSpan timeout) at Microsoft.ApplicationServer.Caching.ReplyContext.Reply(Message message, TimeSpan timeout)

ACTUALIZACIÓN 2

Después de otro día de resolución de problemas tomamos las siguientes acciones que produjeron algunas mejoras:

  1. Basándonos en this y this , aumentamos maxConnectionsToServer a 3 . Como resultado, obtuvimos un 50% más de solicitudes de clientes por segundo según lo registrado por el contador de caché de AppFabric: almacenamiento en caché , pero los errores intermitentes no dejaron de ocurrir.

  2. Incrementamos maxBufferSize y maxBufferPoolSize a 2147483647 (int32.max) en la configuración del servidor de caché . Hasta ahora somos capaces de manejar el volumen de tráfico 300x sin errores. Continuaremos aumentando el volumen de tráfico y monitoreando. Más actualizaciones a seguir

ACTUALIZACIÓN 3

Agregamos dos hosts más con 16 GB cada uno al clúster y habilitamos el modo de Alta disponibilidad (a través de Secondaries=1 ). Actualmente, el host original permanece en el clúster con 96 GB de RAM: todos los hosts tienen cacheSize = 12 GB. En los clientes de caché aumentamos MaxConnectionToServer a 12 (1 por núcleo). A continuación se presentan nuestros resultados:

  • Ocasionalmente obtenemos (una o dos veces cada 10 minutos):
    • ErrorCode<ERRCA0017>:SubStatus<ES0005>:There is a temporary failure. Please retry later. (There was a contention on the store.)
    • ErrorCode<ERRCA0017>:SubStatus<ES0004>:There is a temporary failure. Please retry later. (Replication queue was full. This may happen during reconfiguration of cluster hosts.)
  • Los hosts de caché de 96GB originales todavía experimentan interrupciones de 1 minuto como se describe anteriormente. Los nuevos hosts de caché no han experimentado la interrupción

Tenemos la intención de eliminar 80 GB ram del host de caché original. Más actualizaciones a seguir.

ACTUALIZACIÓN 4

El problema parece haberse resuelto al reducir la cantidad de RAM en los hosts de caché a 16 GB. Ya no vemos los errores intermitentes con el tráfico aumentado a 400x. Parece que la caja está cerrada. Ahora en el próximo número: Alta disponibilidad



Trasponer una respuesta dada por Jeff-ITGuy en social.msdn.microsoft.com :

Parece que te encuentras con un problema casi idéntico al que estoy trabajando con Microsoft en este momento. Si se trata del mismo problema, probablemente se deba a que GC tarda mucho tiempo y causa retrasos en el tiempo de respuesta de AppFabric. Desde sus contadores de rendimiento, parecía que el tiempo de GC se disparó cuando comenzó a tener el problema, por lo que probablemente sea el mismo.

Este problema está siendo investigado activamente por Microsoft. Mientras tanto, para solucionar el problema (al menos a partir de nuestros hallazgos), puede ejecutar más servidores con menos memoria (reducir el tamaño del espacio de memoria en el que trabaja GC) y puede aumentar el RequestTimeout en su cliente. De forma predeterminada, está establecido en 15000 (15 segundos), pero hemos intentado aumentarla a 30000, lo que ayudó a eliminar algunos de los problemas. Esta NO es una buena solución a largo plazo, en mi opinión, simplemente transmitir información. He visto el problema con los servidores que tienen solo 24 gb de memoria (con 12 gb para caché) y realmente solo mejoró notablemente cuando probamos servidores de 8 gb con 4 gb en caché, lo que hizo que GC hiciera MUCHO mejor.

Espero que eso ayude, pero si este es el problema, creo que es que todavía no hay solución.

Ayudó, los errores intermitentes se detuvieron después de que redujimos la memoria RAM del host de caché a 16GB.