WCF: maxConcurrentCalls исчерпал - PullRequest
6 голосов
/ 22 июля 2009

Я нахожусь в процессе устранения неполадок службы WCF, которая в какой-то момент зависает. Поведение службы следующее:

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

Параметры дросселирования:

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

Ниже приводится состояние службы, полученное из дампа зависания:

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 исчерпал себя, а количество сеансов составляет всего 9. Мне интересно, может ли это быть вызвано сбоем в коде клиента об использовании прокси, например, плохой обработкой исключений?

Учитывая дамп памяти службы, есть ли способ найти IP-адреса клиентов?

ТИА.

Ответы [ 3 ]

2 голосов
/ 23 июля 2009

Найден источник проблемы. MaxConcurrentCalls исчерпан из-за тупика в служебном коде. Мы используем ключевое слово c # lock, и кажется, что иногда блокировка не снимается, когда в коде, защищенном блокировкой, происходит что-то странное ...

В любом случае, спасибо всем, кто внес вклад в эту тему.

0 голосов
/ 23 июля 2012

Полагаю, это потому, что вы создаете клиентов с использованием блоков. См. Какой наилучший обходной путь для клиента WCF `using` - проблема с блоком?

0 голосов
/ 22 июля 2009

Это может быть сочетание времени ожидания и способа использования прокси-сервера wcf / вызова службы wcf.

Идея состоит в том, что когда вы звоните в службу, вы не говорите службе закрываться, затем соединение будет зависать до истечения времени ожидания через 10 минут. Следовательно, вы можете совершать 10 вызовов в минуту, которые занимают всего 1 секунду, но через 10 минут у вас будет 100 одновременных подключений.

Использование оператора "using" для создания прокси-сервера обычно исправляет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...