Как интегрированы служба WCF и IIS, какова архитектура и поток входящих запросов

Недавно я технически тестировал службу WCF и дошел до того, что мое непонимание не позволяет мне продвигаться вперед и найти решение проблемы тайм-аута, которую мы видим.

Мы проводим нагрузочное тестирование службы WCF, которая размещена на IIS7 на сервере Windows Server 2008. Система, настроенная для отправки сообщений, фактически запускает их в приложении, которое является biztalk. Затем Biztalk обрабатывает сообщения и отправляет их в конечную точку службы WCF. Служба WCF также использует .net 2.0 в своем пуле приложений (я думаю, это означает, что на самом деле это может быть 3.0 или 3.5, поскольку это не были полные выпуски?

Мы отправляем 40 сообщений в течение секунды, и у 90% из них истекает время ожидания из-за тайм-аута отправки на клиенте (biztalk). Сначала мы думали, что это было странно, потому что мы ожидали, что сначала сработает базовый тайм-аут приема HTTP-привязки сервера, но оказалось, что он был установлен на 10 минут, а время ожидания отправки клиента было установлено на 1 минуту и ​​30 секунд.

Что я понимаю:

Службы WCF имеют файлы конфигурации, в которых есть поведение и привязки http. Конечная точка сервера, на которую мы отправляем XML-сообщение, использует BasicHtppBindings: Тайм-ауты: открытие / закрытие - 1 минута, отправка и получение - 10 минут. Тайм-аут сервера, который, как мы знаем, задействован на данный момент, равен: sendtimeout: 1 минута.

Я понимаю, что архитектура WCF работает путем создания экземпляра фабрики каналов или узла службы и создания стека каналов, который содержит параметры поведения и привязки из конфигурации в виде каналов. Существует TransportAdaptor, который используется для перемещения XML-сообщения после его обработки через стек каналов.

Я понимаю из IIS, что http.sys обрабатывает входящие запросы. Он передает запросы рабочему процессу, а когда он занят, он помещает запросы в очередь режима ядра? Я понимаю, что есть некоторые настройки machine.config, которые можно установить для увеличения этой очереди / ограничения этой очереди?

Я также знаю, как превратить пул приложений в веб-сад, и читал, что вы можете увеличить количество потоков на ядро ​​со значения по умолчанию 12; это делается в настройках реестра или позже в .net при изменении веб-конфигурации.

Я только что прочитал об InstanceContextMode и о том, как он может повлиять на службу сервера ... Но я не уверен, что это установлено в этом случае.

Мы записали несколько счетчиков перфорации, .net, и я заметил количество текущих запросов минус (В очереди + Отключено) = 12. Что означает, что мы используем 1 ядро? и количество потоков на этом ядре установлено равным 12.

Может ли кто-нибудь помочь мне получить более четкую картину и помочь объединить мои знания с некоторыми дополнительными сведениями в нечто более полное?


person TomEaton    schedule 20.10.2011    source источник
comment
У вас есть доступ к услуге? Вы знаете, использует ли он InstanceContextMode, установленный на Single?   -  person Ladislav Mrnka    schedule 20.10.2011
comment
Я знал, что вы спросите об этом :( Я попрошу контакты, которые я должен спросить у разработчиков. Знаете ли вы, что есть способ проверить это, не глядя на код внутри веб-сервиса?   -  person TomEaton    schedule 20.10.2011
comment
InstanceContextMode установлен в PerCall   -  person TomEaton    schedule 24.10.2011
comment
Я нашел, что кто-то еще задает вопрос, это короткий и точный маннор: social.msdn.microsoft.com/Forums/en-US/wcf/thread/   -  person TomEaton    schedule 24.10.2011


Ответы (1)


WCF Behavior имеет настройку дроссельной заслонки. Вот пример (взят из msdn):

  <service 
    name="Microsoft.WCF.Documentation.SampleService"
    behaviorConfiguration="Throttled" />

..... .....

<behaviors>
  <serviceBehaviors>
    <behavior  name="Throttled">
      <serviceThrottling 
        maxConcurrentCalls="1" 
        maxConcurrentSessions="1" 
        maxConcurrentInstances="1"/>
    </behavior>
  </serviceBehaviors>

По умолчанию (если не указано), служба ограничена до 10 одновременных вызовов.

Я считаю, что разумная производственная настройка для клиентов с большим объемом, выполняющих короткие вызовы, больше похожа на 100. Конечно, это зависит от вашей реализации, но дефолт определенно снижает производительность в моей тестовой и производственной системах.

person Joon    schedule 11.11.2011
comment
Спасибо за ваш ответ. Мы устанавливаем для них различные настройки, рекомендованные Microsoft, а также путем тестирования методом проб и ошибок, отслеживая счетчики perfmon для biztalk и службы wcf. Я все еще ищу лучшее понимание того, какие ограничения появляются в первую очередь в IIS, WCF и т.д. - person TomEaton; 23.05.2012
comment
@TomEaton - поскольку ASP.NET и WCF работают в IIS, любое поведение IIS происходит до WCF. Однако я никогда не сталкивался с ограничениями IIS - с моим максимальным параллелизмом, установленным на 100, я смог достичь 100 одновременных вызовов. - person Joon; 24.05.2012