WCF Параллелизм - PullRequest
       11

WCF Параллелизм

1 голос
/ 14 октября 2010

Доброе утро.

У меня проблемы с параллелизмом.Я создал службу 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 на самом деле не то, что я их называю).

1 Ответ

0 голосов
/ 14 октября 2010

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

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

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