2010-10-14 5 views
1

Доброе утро.WCF Параллелизм

У меня проблемы с параллелизмом. Я создал службу WCF, и я протестировал ее, чтобы убедиться, что отдельные вызовы работают нормально. Теперь я выполняю нагрузочное тестирование, и я вижу супервысокое использование ЦП с большим временем ожидания для завершения запросов. Мой инструмент тестирования нагрузки - это просто консольное приложение, настроенное для запуска тестовых примеров MS на нескольких потоках для имитации нескольких клиентов. И мне интересно, может ли кто-нибудь сказать мне, есть ли часть конфигурации службы, конфигурация клиента-прокси (автогенерация) или код для службы, который я должен изменить, чтобы настроить его, чтобы обеспечить высокую степень Параллельный:

Вот мой конфигурационный файл службы.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <services> 
      <service behaviorConfiguration="Behavior" name="Service.MyService"> 
       <endpoint address="" 
        binding="netTcpBinding" 
        bindingConfiguration="Security" 
        contract="Service.IMyService"> 
        <identity> 
         <dns value="localhost" /> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" 
        binding="mexTcpBinding" 
        bindingConfiguration="" 
        contract="IMetadataExchange" />   
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://localhost:808/Service" /> 
        </baseAddresses> 
        <timeouts closeTimeout="00:01:00" openTimeout="00:05:00" /> 
       </host> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="Behavior"> 
        <serviceMetadata httpGetEnabled="false" /> 
        <serviceDebug includeExceptionDetailInFaults="false" /> 
        <serviceThrottling maxConcurrentCalls="300" maxConcurrentSessions="5000" maxConcurrentInstances="300" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <bindings> 
      <netTcpBinding> 
       <binding name="Security" openTimeout="00:05:00" maxConnections="10"> 
        <reliableSession inactivityTimeout="00:30:00" enabled="true" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" protectionLevel="None" /> 
        </security> 
       </binding> 
      </netTcpBinding> 
     </bindings> 
    </system.serviceModel> 
</configuration> 

Вот мой конфигурационный файл клиента.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="NetTcpBinding_IMyService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
      maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" 
      maxReceivedMessageSize="65536"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:30:00" 
       enabled="true" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"> 

      </transport> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <client> 
     <endpoint address="net.tcp://localhost:808/Service" binding="netTcpBinding" 
      bindingConfiguration="NetTcpBinding_IMyService" contract="ServiceReference.IMyService" 
      name="NetTcpBinding_IMyService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration>

И вот атрибуты, которые я поместил в свой класс обслуживания WCF.


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

Я прочитал больше, чем несколько статей на MSDN, чтобы попытаться понять, что я должен делать в этом случае, и я, кажется, исключили оборудование является причиной этой проблемы.

Кроме того, я заменил любые имена объектов в приведенных выше конфигурациях с помощью общих имен (например, MyService и IMyService на самом деле я их не называю).

+0

Прошел через это, я предполагаю? http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode.aspx –

+0

Где используется High-Cpu, на сервере или на клиенте? (Или они работают в одном окне?) –

+0

Высокое использование ЦП на стороне сервера. Они работают на разных коробках. – bitcycle

ответ

0

Если вы установили InstanceContextMode = PerCall, значит, ваша служба будет воссоздана каждый раз при вызове. Проверьте, сколько стоит создать новый экземпляр службы.

Вы можете попробовать установить его в PerSession или Single. (http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode.aspx)

Смежные вопросы