Problembehandlung bei AppFabric-Skalierungsproblemen (Intermittent ErrorCode & lt; ERRCA0017 & gt;: SubStatus & lt; ES0006 & gt; -Fehler)
Haben wir umgesetzt AppFabric für Windows Server-Cache für unsere web-Anwendung. Zunächst konnten wir den cache ohne Probleme. Wir stiegen dann Datenverkehr etwa 100 Falten, und begann erleben intermittierende Ausnahmen. Die Ausnahmen auftreten, etwa einmal pro 2 Tage, für etwa eine minute zu einer Zeit.
Unserer Konfiguration:
- 9 web-Server einsetzen/abrufen von Objekten, die im cache:
- Meist zeitlichen 500 byte operative Objekte des Typs
- Mit 1 benannte region
- Gespeicherten Objekte mit den tags
- Abgerufen in der Masse für einen bestimmten tag
- Cache-Cluster:
Den Fehler in der Reihenfolge, in der Sie auftreten (die Ausnahmen sind, treten jede der neun Webserver während der 1-Minuten-Zeitraum):
-
System.Net.Sockets.SocketException : Eine vorhandene Verbindung wurde zwangsweise geschlossen durch remote-host
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) -
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) -
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)
Haben wir auch ein tracelog-Sitzung auf dem caching-server zu erfassen, weitere Informationen zur diagnose des Problems - irgendwelche Vorschläge auf, wie zu analysieren, dies würde geschätzt werden (kann ich zur Verfügung stellen, wenn es sein muss).
Wir auch überwacht verschiedene AppFabric -, CLR -, und Netzwerk-Leistungsindikatoren, unten ist ein screenshot von der Veranstaltung, wie es Auftritt:
Dank im Voraus für jede Gedanken oder Beratung können Sie gemeinsam an der Lösung dieses Problems.
UPDATE 1
Im folgenden sind die vorkommenden Ausnahmen kontinuierlich auf die AppFabric Caching Server während der intermittierenden Fehler (abstrahiert von tracelogs) :
-
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)
UPDATE 2
Nach einem weiteren Tag der Fehlersuche nahmen wir die folgenden Maßnahmen, die produziert einige Verbesserungen:
-
Basierend auf diese und diese erhöhten wir
maxConnectionsToServer
zu3
. Als Ergebnis konnten wir 50% mehr client-Anfragen/Sek. aufgenommen von der AppFabric Caching:Cache-perf Zähler, aber der intermittierenden Fehlern nicht stoppen auftretenden -
Erhöhten wir die
maxBufferSize
undmaxBufferPoolSize
zu2147483647
(int32.max) auf den Cache-Server Konfiguration. So weit sind wir in der Lage zu handhaben 300x traffic volume w/o-Fehler. Wir werden weiterhin für den Verkehr zu erhöhen Volumen und überwachen. Mehr updates Folgen
UPDATE 3
Wir noch zwei weitere hosts mit 16GB in jedem cluster und aktiviert Hochverfügbarkeits-Modus (via Secondaries=1
). Derzeit ist die original-host bleibt im cluster mit 96GB ram - alle Gastgeber haben cacheSize = 12
GB. Auf der cache-clients erhöhen wir die MaxConnectionToServer
zu 12
(1 pro Kern). Unten sind unsere Ergebnisse:
- Gelegentlich erhalten wir (einmal oder zweimal alle 10 Minuten):
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.)
- Die original-96GB-cache hosts noch Erfahrungen 1 minute Ausfälle wie oben beschrieben. Die neue cache-hosts nicht erlebt haben, den Ausfall
Planen wir entfernen 80GB ram aus der ursprünglichen cache-host. Mehr updates Folgen.
UPDATE 4
Scheint das problem wurde gelöst, indem die Menge an RAM in den cache hosts zu 16GB. Wir haben nicht mehr sehen, die der intermittierenden Fehler mit der Verkehr nahm zu 400x. Scheint cased geschlossen. Nun zum nächsten Problem: Hochverfügbarkeit
InformationsquelleAutor der Frage HOCA | 2012-09-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
In deinem code prüfst du für die Ausnahme und die retrylater bool?
Die Verwendung des benannten region zwingt den server zu schieben, die Werte der benannten region auf einem einzigen server, sondern die Verteilung der hashes auf allen cache-Servern. ("Dieser zusätzliche such-Funktionen, Objekte in einer region beschränkt sich auf einen einzigen cache host". http://msdn.microsoft.com/en-us/library/ee790985(v=azure.10).aspx )
Was ich empfehlen würde, ist, dass Sie die Splitter Ihres namens region-über 2 weitere Server und setzen Sie Sie in einem cluster. Auf diese Weise sind Sie die Begrenzung der Ausnahmen auf einen kleineren server, wenn es ausgeführt wird die GC und versuchen zu finden, mehr ram zu setzen und zu speichern, Objekte und tags.
InformationsquelleAutor der Antwort Josh
Umbuchung eine Antwort gegeben, indem Jeff-ITGuy auf social.msdn.microsoft.com:
Es half, die intermittierende Fehler beendet, nachdem wir reduziert die cache-host-RAM zu 16GB.
InformationsquelleAutor der Antwort HOCA
Den fix für dieses Problem ist aktuell hier verfügbar:
http://support.microsoft.com/kb/2787717
InformationsquelleAutor der Antwort Alfan