我很擅长用VS加载测试,但我认为我已经正常设置了所有内容,并且我遇到了一个问题,即我的负载测试的执行速度很快达到了100%的CPU利用率。这似乎可能会影响我的测试结果,我认为这不是预期的行为。
我的硬件平台是一款功能强大的开发人员机器:几个月前配备四核,12GB内存,2个IDE驱动器和一个快速NIC。我可以在必要时详细说明,但通常我会说它尖叫。
我正在使用VS2010 SP1,C#/ .NET 4测试在Win7 x64本地运行的MVC2 / 3应用程序,针对MSSQL 2008。
底层测试是一个单元测试,它运行单个MVC控制器方法,该方法使用Unity和其他Ent-Lib库根据用户的权限从数据库中提取客户端集合。单元测试的典型执行时间为0.4到0.6秒。
负载测试设置为暴露性能问题并运行10分钟:
观察:
作为单个用户的前30秒,执行有点不稳定。第一次测试需要3秒,这是正常的预热。接下来的15个左右需要大约.4秒,这是完美的。然而,在10秒之后,测试开始运行5秒。这是之前第二个虚拟用户。随着其他虚拟用户的加入,测试时间逐渐增加,这是预期的,尽管运行时间似乎仍然很长。
更令人担忧的是,用户6周围的CPU利用率飙升(在所有8个核心之前平均约为20%)。在用户6和7处,CPU达到70%并且由用户8在8个核上固定为100%,并且它保持在那里直到测试在10分钟后结束。毋庸置疑,对于正常的阶梯式测试,我想从10个并发用户开始,然后达到100个或更多,但我的CPU从100%开始,结果肯定是不准确的。
正如我从执行任务中可以看到的那样,杯子显然是QTAGENT.EXE。它使用我所看到的每个备用CPU周期。我也以32位模式运行此负载测试,QTAGENT32.EXE运行类似。
我为什么遇到这个问题感到茫然,更不用说该怎么做了。任何提案或解决方案表示赞赏。 TIA!
修改
我发现我的问题的解决方法是通过单击“调试测试”而不是“运行测试”来启动负载测试。这对我来说没有任何意义,事实上它就像我期望的那样;但是,我不能否认它一直在用100个用户运行我的测试,只是半打我的CPU(平均约为50%的尖峰)。
答案 0 :(得分:5)
QTAgent是执行所有负载测试工作的代码。它遍历执行测试的每个虚拟用户。
测试代理CPU被绑定的一个原因是您的网站正在快速反击结果。模拟这种情况的一种好方法是加载测试静态html页面,或者请求IIS充分缓存的页面。
检查测试的每秒请求数值。该值是衡量QTAgent需要做多少工作的合理指标。
对于每个测试,您的QTAgent必须处理并发送html请求,记录收到的测试并存储结果以及所有性能监控统计信息。
我建议下一步在每个单元测试之间添加1秒的延迟,这样可以让你加载更多的虚拟用户。
也就是说,在CPU挂起之前,在同一台机器上托管的Web应用程序上运行负载测试无法处理很多虚拟用户。
您可以发布每秒请求数据吗?
答案 1 :(得分:1)
所以它归结为用户错误。原来我测试的控制器是超级资源密集型的。我读到这是其他地方高CPU使用率的最可能的原因,但我假设(哎呀)8个并发用户点击这个特定的控制器可能无法挂住我的CPU。不,实际上,我们的代码运行起来非常昂贵,并且同时请求该页面的8个用户将最大化。感谢您的所有建议。
答案 2 :(得分:0)
这里的某些内容可能有所帮助:https://serverfault.com/questions/16005/what-affects-sql-connection-speed
其他想法:
SQL Server是否在本地方框上?在同一个盒子上运行测试可能会导致问题,因为SQL Server和QTAgent将争夺处理时间。每个测试线程将由一个数据库线程匹配,除非您的单元测试异步调用数据库,否则它们将在数据库响应时忙于等待。在8个用户中,这是8个单元测试线程和8个数据库线程...可能16个线程全速运行足以砰击CPU。
您的测试在每次迭代后是否关闭连接,或者您是否可能打开连接?您可以检查Perfmon中的SQL Server连接计数以确定它。
是SQL Server Express吗?也许它没有其他版本那么强大。