Улучшение производительности сервиса WCF - PullRequest
1 голос
/ 18 ноября 2011

Моя компания владеет сервером с 24 ядрами и большим количеством оперативной памяти.ОС Windows 2008 R2 SP1.Я развернул на этом сервере приложение WCF, размещенное в IIS.На этом же сервере я установил многопоточный клиент, который как можно чаще вызывает один из сервисов WCF.Я столкнулся с узким местом: все ядра на сервере используются, но на очень низком уровне, поэтому загрузка процессора не превышает 10%.Моя служба WCF настроена следующим образом:

  <system.serviceModel>
<services>
  <service behaviorConfiguration="myBehavior" name="...">
    <endpoint address="" binding="netTcpBinding" bindingConfiguration="myBinding" bindingNamespace="..." contract="..."/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="myBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="200" />
    </behavior>
  </serviceBehaviors>
</behaviors>

<bindings>
  <netTcpBinding>
    <binding name="myBinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="2147483647" maxReceivedMessageSize="2147483647" portSharingEnabled="false" transactionFlow="false" listenBacklog="2147483647">
      <security mode="None">
        <message clientCredentialType="None"/>
        <transport protectionLevel="None" clientCredentialType="None"/>
      </security>
      <reliableSession enabled="false"/>
      <readerQuotas maxDepth="64" maxStringContentLength="204800" maxArrayLength="204800" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
    </binding>
  </netTcpBinding>
</bindings>

Моя служба также имеет следующие атрибуты: InstanceContextMode.Single и ConcurrencyMode.Multiple.Кто-нибудь сталкивался с подобной проблемой?Я искал решение в течение нескольких дней, но пока не нашел его: (

Заранее спасибо!

1 Ответ

4 голосов
/ 18 ноября 2011

Я не уверен, как вы измеряете узкое место в производительности, но независимо от того, сколько клиентских вызовов вы генерируете, служба будет обрабатывать только 200 вызовов одновременно. NetTcpBinding использует сеансы, поэтому в настройках есть настройка maxConcurrentSessions="200". Вы настроили службу как многопоточный синглтон, который ограничен 200 одновременными вызовами с помощью параметра maxConcurrentCalls="200". Загрузка ЦП также будет зависеть от того, сколько работы выполняется во время каждого вызова и от того, связан ли он с вводом-выводом или нет. Просмотрите документацию для элемента serviceThrottling и попробуйте увеличить обе настройки, чтобы увидеть, улучшается ли ваша пропускная способность.

Если ваша сервисная реализация позволяет, я бы порекомендовал вам попробовать настроить сервис с InstanceContextMode.PerSession и ConcurrencyMode.Single, чтобы сравнить пропускную способность с вашей текущей конфигурацией. IIS 7x размещает службы WCF с использованием службы активации процессов Windows (WAS). WAS предназначен для обработки параллелизма. Одноэлементная конфигурация сводит на нет ценность использования WAS.

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