18

Web アプリケーション用に AppFabric Windows Server Cache を実装しました。最初は、問題なくキャッシュを使用できました。その後、トラフィックが約 100 倍に増加し、断続的な例外が発生し始めました。例外は、およそ 2 日に 1 回、一度に約 1 分間発生します。

私たちの構成:

  • キャッシュ内のオブジェクトを挿入/取得する 9 つの Web サーバー:
    • 主に一時的な 500 バイトの操作型オブジェクト
    • 1 つの名前付きリージョンの使用
    • タグで保存されたオブジェクト
    • 特定のタグの一括取得
  • キャッシュ クラスタ:
    • 1 ホスト (リード) AppFabric 1.1 (get-cachehost によって報告されるバージョンは 3)
    • SQL 構成プロバイダー
    • ホストに 96GB の RAM、AppFabric に割り当てられたデフォルトの 50% (48GB)
    • キャッシュ ホスト構成
    • クライアント構成のキャッシュ

エラーは発生順に表示されます (例外は、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、およびネットワーク パフォーマンス カウンターも監視しました。以下は、イベントが発生したときのスクリーンショットです。

AppFabric Perfmon キャプチャ

この問題を解決するために共有できるご意見やアドバイスをお寄せいただきありがとうございます。

更新 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 日トラブルシューティングを行った後、次のアクションを実行した結果、いくつかの改善が得られました。

  1. これこれに基づいて、に増加maxConnectionsToServerしました3その結果、 AppFabric Caching:Cache パフォーマンスカウンターによって記録されたクライアント リクエスト/秒が 50% 増加しましたが、断続的なエラーの発生は止まりませんでした。

  2. キャッシュ サーバー構成でmaxBufferSizeandmaxBufferPoolSize2147483647(int32.max) に増やしました。これまでのところ、エラーなしで 300 倍のトラフィック量を処理できます。今後もトラフィック量を増やして監視していきます。今後のアップデート

更新 3

それぞれ 16 GB のホストをさらに 2 つクラスターに追加し、HighAvailability モードを有効にしました ( 経由Secondaries=1)。現在、元のホストは 96 GB の RAM を持つクラスターに残ります。すべてのホストにはcacheSize = 12GB があります。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 に増加すると、断続的なエラーは発生しなくなりました。ケースは閉じているようです。次の話題に移りましょう:高可用性

4

3 に答える 3

3
  1. http://support.microsoft.com/kb/983182およびhttp://support.microsoft.com/kb/2527387をインストールしましたか?
  2. コードで、例外と再試行後のブール値をチェックしますか?

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

    名前付きリージョンを使用すると、サーバーは、すべてのキャッシュサーバーにハッシュを分散するのではなく、その名前付きリージョンの値を単一のサーバーにプッシュします。(「この追加の検索機能を提供するために、リージョン内のオブジェクトは単一のキャッシュホストに制限されます。」http://msdn.microsoft.com/en-us/library/ee790985(v=azure.10).aspx

私がお勧めするのは、名前付きリージョンをさらに2台のサーバーに分割し、それらをクラスターに配置することです。このようにして、GCを実行しているときに例外をより小さなサーバーに制限し、オブジェクトとタグを配置および格納するためのより多くのRAMを見つけようとします。

于 2012-09-11T13:37:00.603 に答える
3

social.msdn.microsoft.comでのJeff-ITGuyによる回答の再投稿:

あなたは、私が現在 Microsoft と協力している問題とほぼ同じ問題に遭遇しているようです。同じ問題である場合、GC に時間がかかり、AppFabric の応答時間の遅延が原因である可能性があります。パフォーマンス カウンターから、問題が発生し始めたときに GC 時間が急上昇したように見えたので、おそらく同じ問題です。

この問題は、Microsoft によって積極的に調査されています。それまでの間、問題を軽減するために (少なくとも私たちの調査結果から)、より少ないメモリでより多くのサーバーを実行し (GC が動作するメモリ空間のサイズを縮小します)、クライアントの RequestTimeout を増やすことができます。デフォルトでは 15000 (15 秒) に設定されていますが、いくつかの問題を解消するのに役立つ 30000 に上げてみました。私の意見では、これは良い長期的な解決策ではなく、情報を伝えるだけです. メモリが 24 GB (キャッシュ用に 12 GB) しかないサーバーの問題を見たことがありますが、4 GB をキャッシュに設定して 8 GB サーバーを試したときに、実際に顕著に良くなっただけでした。

お役に立てば幸いですが、これが問題である場合は、まだ解決策がないと思います。

キャッシュ ホスト RAM を 16GB に減らした後、断続的なエラーが停止しました。

于 2012-09-12T21:53:31.620 に答える
2

この問題の修正は現在、 http ://support.microsoft.com/kb/2787717 から入手できます。

于 2013-09-17T09:19:42.853 に答える