2009-07-22 8 views
6

ある時点でハングするWCFサービスのトラブルシューティングが進行中です。 サービスの動作は以下の通りです:WCF:maxConcurrentCallsが使い果たされました

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

スロットリングのパラメータは次のとおりです。

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) 

あなたが見ることができるように、maxConcurrentCalls:

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

後はハングダンプから取られたサービス状態でありますセッション数は9だけですが、使い果たされました。 これは、プロキシに関するクライアントコードの誤動作使用法、貧弱な例外処理のような?

サービスのメモリダンプがあると、クライアントのIPアドレスを見つける方法はありますか?

TIA。

答えて

2

問題の原因が見つかりました。 サービスコードのデッドロックのためにMaxConcurrentCallsが使い果たされました。 私たちはc#lockキーワードを使用していますが、ロックによって保護されたコードに何か不思議が起きたときに、ロックが解除されないことがあります...

とにかくこのスレッドに貢献してくれてありがとう。

+0

こんにちは、私は同様の問題があります(http://stackoverflow.com/questions/20842923/wcf-maxconcurrentsessions-exceededを参照してください)。あなたのソリューションとデバッグテクニックに関する追加情報を私に教えてください。ありがとうございました! –

0

これは、タイムアウトと、wcfプロキシの使用方法/ wcfサービスの呼び出し方法の組み合わせになります。

あなたがサービスに電話をかけたときにサービスを終了するように指示しないと、接続は10分後にタイムアウトするまでハングアップします。したがって、1分間に10回のコールを行うことはできますが、1秒しかかかりませんが、10分後に100回の同時接続があります。

"using"ステートメントを使用してプロキシを作成すると、通常これが修正されます。

+0

パフォーマンスカウンターを見ると、対応するエンドポイントにServiceModelService 3.0.0.0インスタンスがあります。 あなたが記述したシナリオでは、新しい呼び出しごとにインスタンス数が増加し、接続時間が終了するたびに低下します。 私の場合、通常の状況では、値は0と1です。サービスには1秒あたり最大1コールしかありません。私はprobemが再現されるまで待ってからカウンターを見てください。 –

0

私はブロックを使ってクライアントを作成しているからだと思います。 What is the best workaround for the WCF client `using` block issue?

+0

こんにちは、私は似たような問題があります(http://stackoverflow.com/questions/20842923/wcf-maxconcurrentsessions-exceededを参照してください)。いくつかの追加情報を提供できますか?ありがとうございました! –

関連する問題