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 负载测试一起使用的主要内容,如果未能解决你的问题,请参考以下文章
Debug.WriteLine 未将输出写入 Visual Studio 2010 中的 OutputWindows
Visual Studio 2019 未将引用的项目添加到 deps.json