WCF 未将所有内核与 Visual Studio 2010 负载测试一起使用

Posted

技术标签:

【中文标题】WCF 未将所有内核与 Visual Studio 2010 负载测试一起使用【英文标题】:WCF not using all cores with Visual Studio 2010 Load Testing 【发布时间】:2011-03-15 15:24:32 【问题描述】:

我已经开发了一个 WCF 服务,并且我正在使用 Visual Studio 2010 负载测试基础架构测试它的性能。我的桌面上有一个四核 Intel Q6600,目前,WCF 托管在控制台应用程序上以进行测试。在执行测试时,我有 1 个核心在 100%,另外 3 个在 25% 到 60% 之间。 HostApplication.exe 进程仅用于短暂实例通过 25%,我不知道为什么。为什么 WCF 不将调用分散到其他内核,这样我就没有 CPU 瓶颈?我不应该让 HostApplication.exe 分布在 1 个以上的核心上,限制在 25% 吗? 我已经为 25 个用户配置了 VS2010 负载测试,他们正在调用 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>

非常感谢任何帮助。 任何建议将不胜感激。

【问题讨论】:

您正在测试的两种方法是否受 CPU 限制? 原谅我的无知,但我怎么知道呢?我只做基本的数据库操作。它们都是数据库上的事务。我确实使用 Enteprise Library 的日志记录对象仅记录到 XML 异常。但是在 2-3 分钟的测试中,在 6000 次方法调用中,我没有例外。 相信您已经回答了这个问题。数据库操作将比 CPU 操作慢很多。执行数据库调用时,可能会占用您线程中熊市的份额。将流程放在配置文件下,这应该可以确定您的代码时间花在了哪里。 @Jesse 我应该使用哪个分析器?我可以用 VS2010 做到这一点吗?我从来没有做过这样的分析。谢谢你的时间 Tks.. 我正在下载它...但是,即使是数据库降低了我的服务速度,也不应该分散在 4 个内核之间,因为我有 25 个线程电话?为什么我会有 1 个 100% 的核心? Tks 【参考方案1】:

在我将 WCF 服务从自托管可执行文件转移到 IIS/AppFabric 后,使用完全相同的代码和数据库建模,我能够毫无问题地使用所有 4 个内核。转会后我的表现很好。 提示

【讨论】:

【参考方案2】:

从 cmets 看来,您的瓶颈似乎是数据库。

如果是这种情况,您可以做的最佳优化是通过在内存中缓存数据来避免磁盘访问。

由于您已经使用 Enterprise Libray,因此您可以使用它。我们已经在几个项目中使用了它,它对我们很有效。

【讨论】:

对不起,请帮助我理解。如果我的主机应用程序以 100% 的速度占用单个内核,它怎么可能是数据库?如果我有 25 个用户调用 WCF 服务,不应该在 4 个核心之间分配吗?谢谢你的时间 可能是您的数据库绑定到单核

以上是关于WCF 未将所有内核与 Visual Studio 2010 负载测试一起使用的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 未将对象引用设置到对象的实例

Debug.WriteLine 未将输出写入 Visual Studio 2010 中的 OutputWindows

Visual Studio 2019 未将引用的项目添加到 deps.json

如何使用 Visual Studio 19 从网站步入 WCF asp.net 服务应用程序

Visual Studio 中的 WCF Web 服务

Visual Studio 2015 中的 WCF 测试客户端在哪里