WCF не использует все ядра с нагрузочным тестированием Visual Studio 2010 - PullRequest
0 голосов
/ 15 марта 2011

Я разработал службу WCF и тестирую ее на производительность с помощью инфраструктуры нагрузочного тестирования Visual Studio 2010. У меня на рабочем столе Quad Core Intel Q6600, и на данный момент WCF размещается в консольном приложении для тестирования. При выполнении тестов у меня 1 ядро ​​на 100%, а остальные 3 - от 25 до 60%. Процесс HostApplication.exe только для кратких экземпляров проходит 25%, и я не знаю почему. Почему WCF не распределяет вызовы по другим ядрам, чтобы у меня не было узкого места в процессоре? Разве я не должен иметь HostApplication.exe, распределенный по более чем 1 ядру, ограниченный 25%?
У меня есть настройки нагрузочного тестирования VS2010 с 25 пользователями, и они вызывают 2 метода. В реализации службы методов, которые я использую, для ServiceBehaviour настроено следующее:

  [ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.ReadCommitted, 
    InstanceContextMode=InstanceContextMode.PerCall, ConcurrencyMode=ConcurrencyMode.Multiple, ReleaseServiceInstanceOnTransactionComplete=false)]

Я также определил поведение serviceThrottling для сервиса. Ниже мой app.config:

  <system.serviceModel>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
        <bindings>
            <basicHttpBinding>
                <binding name="SimpleBinding" />
            </basicHttpBinding>
            <netTcpBinding>
              <binding name="DefaultTCPBinding" closeTimeout="01:00:00" receiveTimeout="01:00:00"
                    sendTimeout="01:00:00" transactionFlow="true" transactionProtocol="OleTransactions"
                    maxBufferSize="5242880" maxReceivedMessageSize="5242880">
                <reliableSession inactivityTimeout="01:00:00" />
              </binding>
            </netTcpBinding>
            <webHttpBinding>
                <binding name="ScriptBindig" crossDomainScriptAccessEnabled="true" />
            </webHttpBinding>
        </bindings>
        <behaviors>
              <endpointBehaviors>
                    <behavior name="WebScriptBehavior">
                          <enableWebScript />
                    </behavior>
              </endpointBehaviors>
              <serviceBehaviors>
                    <behavior name="MetadataBehavior">
                          <serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding"
                                httpGetBindingConfiguration="" />
                          <serviceDebug includeExceptionDetailInFaults="true" />
                          <serviceThrottling maxConcurrentCalls="64" maxConcurrentSessions="400"
                                maxConcurrentInstances="464" />
                    </behavior>
              </serviceBehaviors>
        </behaviors>
        <services>
              <service behaviorConfiguration="MetadataBehavior" name="Implementation.TestingAppImplementation">
                    <endpoint address="" binding="netTcpBinding" bindingConfiguration="DefaultTCPBinding"
                          name="TestingAppTCPEndpoint" contract="Interfaces.ITestingApp" />
                    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
                          name="TestingAppMex" contract="IMetadataExchange" />
                    <endpoint address="ws" behaviorConfiguration="" binding="basicHttpBinding"
                          bindingConfiguration="SimpleBinding" name="TestingApp" contract="Interfaces.ITestingApp" />
                    <host>
                          <baseAddresses>
                                <add baseAddress="net.tcp://desk01:9878/TestingAppService" />
                                <add baseAddress="http://desk01:9876/TestingAppService/" />
                          </baseAddresses>
                    </host>
              </service>
        </services>
    <diagnostics>
      <messageLogging logEntireMessage="true"
                      logMalformedMessages="true"
                      logMessagesAtTransportLevel="true" />
    </diagnostics>
  </system.serviceModel>

Большое спасибо за любую помощь. ЛЮБОЙ совет будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 27 марта 2011

После того, как я перевел службу WCF из исполняемого файла с собственным хостом в IIS / AppFabric с тем же точным кодом и моделированием базы данных, я смог без проблем использовать все 4 ядра. Я получил отличную производительность после передачи.
Tks

0 голосов
/ 15 марта 2011

По комментариям похоже, что ваше узкое место - это база данных.

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

Поскольку вы уже используете Enterprise Libray, вы можете использовать это. Мы использовали это в нескольких проектах, у нас это хорошо работало.

...