【发布时间】:2014-02-03 15:54:17
【问题描述】:
我的问题是关于一个简单测试网站的性能。
为了测试性能,我使用jMeter 在此页面上模拟 75 个用户(连续)。 该页面仅对 GetHello() 进行 Web 服务调用并打印结果。
webservice 方法做的不多:
public string GetHello(){
int count = 0;
foreach(int i = 0; i < 10000000; i++){
count++;
}
return "hello world "+ count;
}
但在性能结果中,我看到平均加载时间越来越长……这对我来说似乎不合逻辑。我不知道去哪里解决这个问题。
网站服务器(2个四核处理器2.33Ghz,8G内存)内存和CPU不忙,Web服务服务器(与网站服务器相同的硬件设置)内存不忙但CPU使用率介于60% 和 100%...
我想到的是 IIS 设置问题或 web.config 配置(用于网站或 web 服务)但我找不到任何解决方案......或者解释为什么会发生这种情况。 这种简单的代码在我眼里应该不会是问题吧?
更新: 当我从网络服务中删除循环时......看起来没有问题。所以只要在 webservice 方法中需要一点计算,平均处理时间就会增加。
更新 2
情况变慢
我们的网站遇到了性能问题。 我们已经设置了一个测试环境来确定问题发生在哪里。 测试环境由 3 台服务器组成。 (2 代表前端(网站)和 1 代表后端(wcf webservices))。 服务器规格:
- 网站 1:英特尔至强 e5410 (2x) 8GB 内存
- 网站 2:英特尔至强 x3323 4GB 内存
- Web 服务:Intel Xeon e5410 (2x) 8GB 内存
网络服务正在使用 net.tcp 端点 使用 Jmeter,我们向网站 1 上的 1 个页面发送 75 个并发请求。 响应时间持续增加约 5 秒,然后趋于平稳。 当我们使用浏览器访问网站 1 时,该网站的响应时间很长。 当我们转到网站 2,同一页面时,网站速度很快。 使用 netstat -t 我们可以看到网站 1 只有大约 30 个与 Web 服务的连接。 网站web.config中的endpoint绑定如下:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<bindings>
<netTcpBinding>
<binding name="netTCPBinding" maxReceivedMessageSize="999999999" sendTimeout="00:03:00" closeTimeout="00:03:00" receiveTimeout="00:03:00" maxConnections="65355">
<readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://192.168.1.124:21130/ContentService.svc" binding="netTcpBinding" bindingConfiguration="netTCPBinding" contract="ContentWS.IContentService" name="Default1">
</endpoint>
<endpoint address="net.tcp://192.168.1.124:21131/Service.svc" binding="netTcpBinding" bindingConfiguration="netTCPBinding" contract="PrijsvrijWS.IService" name="Default">
</endpoint>
</client>
</system.serviceModel>
这是网络服务的配置:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="netTCPBinding" maxReceivedMessageSize="999999999" sendTimeout="00:03:00" closeTimeout="00:03:00" receiveTimeout="00:03:00" maxConnections="65355">
<readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="ajaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="serviceWithMetadata">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling maxConcurrentCalls="100" maxConcurrentInstances="100" maxConcurrentSessions="100" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
<services>
<service behaviorConfiguration="serviceWithMetadata" name="WcfService.Service">
<endpoint address="net.tcp://localhost:21131/Service.svc" binding="netTcpBinding" bindingConfiguration="netTCPBinding" name="Default" contract="WcfService.IService" />
</service>
<service behaviorConfiguration="serviceWithMetadata" name="WcfService.ContentService">
<endpoint address="net.tcp://localhost:21130/ContentService.svc" binding="netTcpBinding" bindingConfiguration="netTCPBinding" name="Default" contract="WcfService.IContentService" />
</service>
</services>
</system.serviceModel>
我们尝试了 servicethrottling,但它似乎没有效果。 测试期间服务器CPU使用情况如下:
- 网站 1:大约 60%,最大 90%
- 网站 2:1%
- Web 服务:大约 25%,最大 50%
我们是在网站 1 的最大值下运行还是缺少一些设置?
【问题讨论】:
-
我认为“猜测”问题出在哪里是徒劳的。你需要做的是得到一个像
Ants Profiler这样的工具并在两边运行它,看看代码中的热路径是否存在问题,或者内存泄漏。如果没有,您可以开始考虑 IIS。我会先看看你自己的代码。您可以获得 14 天试用版,让您滚动。只是我的两分钱。 -
我同意先看我自己的代码……但几乎没有代码。网络服务就是你在我的帖子中看到的,网站只调用这个网络服务。
-
@Josh - 在英特尔架构中,每个内核有两个线程,因此 4 个内核将是 8 个线程。管道的某些部分是共享的,所以它不是真正的 8 个线程,但是......只是说:)
-
如果您正在进行计算密集型工作,那么可以。通常,您会为这类事情设置一个单独的应用程序服务器集群。否则,大多数 Web 服务通常只是从数据库中访问一些信息,进行一点处理并通过网络发送信息。因此,在 CPU 上花费的时间充其量是最少的。
-
@BvdVen - 是的,这很正常,对于具有计算绑定操作的大规模生产系统来说,这是一个真正的问题。您可以做的是使用
Task对象将处理请求的线程的数学运算卸载到线程池中的线程。这不会完全解决您的问题,因为Tasks 仍将绑定到 CPU。它将允许将 HTTP 处理与 CPU 绑定线程分开,因此这些可以并行发生。
标签: asp.net performance web-services jmeter