Web アプリケーション用に AppFabric Windows Server Cache を実装しました。最初は、問題なくキャッシュを使用できました。その後、トラフィックが約 100 倍に増加し、断続的な例外が発生し始めました。例外は、およそ 2 日に 1 回、一度に約 1 分間発生します。
私たちの構成:
- キャッシュ内のオブジェクトを挿入/取得する 9 つの Web サーバー:
- 主に一時的な 500 バイトの操作型オブジェクト
- 1 つの名前付きリージョンの使用
- タグで保存されたオブジェクト
- 特定のタグの一括取得
- キャッシュ クラスタ:
エラーは発生順に表示されます (例外は、1 分間に9 つの Web サーバーのそれぞれで発生します)。
System.Net.Sockets.SocketException : 既存の接続がリモート ホストによって強制的に閉じられました 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)
また、問題を診断するためのより多くの情報を取得するために、キャッシュ サーバーでトレースログ セッションを作成しました。これを分析する方法に関する提案をいただければ幸いです (必要に応じて利用できるようにします)。
また、さまざまな AppFabric、CLR、およびネットワーク パフォーマンス カウンターも監視しました。以下は、イベントが発生したときのスクリーンショットです。
この問題を解決するために共有できるご意見やアドバイスをお寄せいただきありがとうございます。
更新 1
以下は、断続的なエラー中に AppFabric キャッシュサーバーで継続的に発生する例外です(トレースログから抜粋)。
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)
更新 2
もう 1 日トラブルシューティングを行った後、次のアクションを実行した結果、いくつかの改善が得られました。
これとこれに基づいて、に増加
maxConnectionsToServer
しました3
。その結果、 AppFabric Caching:Cache パフォーマンスカウンターによって記録されたクライアント リクエスト/秒が 50% 増加しましたが、断続的なエラーの発生は止まりませんでした。キャッシュ サーバー構成で
maxBufferSize
andmaxBufferPoolSize
を2147483647
(int32.max) に増やしました。これまでのところ、エラーなしで 300 倍のトラフィック量を処理できます。今後もトラフィック量を増やして監視していきます。今後のアップデート
更新 3
それぞれ 16 GB のホストをさらに 2 つクラスターに追加し、HighAvailability モードを有効にしました ( 経由Secondaries=1
)。現在、元のホストは 96 GB の RAM を持つクラスターに残ります。すべてのホストにはcacheSize = 12
GB があります。MaxConnectionToServer
キャッシュ クライアントでは、12
(コアあたり 1)に増やします。以下は調査結果です。
- ときどき (10 分ごとに 1 回か 2 回):
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.)
- 元の 96GB キャッシュ ホストでは、前述のように 1 分間の停止が引き続き発生します。新しいキャッシュ ホストでは障害が発生していません
元のキャッシュ ホストから 80 GB の RAM を削除する予定です。さらにアップデートが続きます。
更新 4
この問題は、キャッシュ ホストの RAM の量を 16GB に減らすことで解決されたようです。トラフィックが 400x に増加すると、断続的なエラーは発生しなくなりました。ケースは閉じているようです。次の話題に移りましょう:高可用性