5

我对使用 VS 进行负载测试还很陌生,但我认为我已经正常设置了所有内容,并且我遇到了一个问题,即我的负载测试的执行迅速达到 100% CPU 利用率。这似乎很可能会影响我的测试结果,我认为这不是预期的行为。

我的硬件平台是一个强大的开发机器:几个月前有一个四核、12GB RAM、2 个 IDE 驱动器和一个快速 NIC。如有必要,我可以详细说明,但通常我会说它尖叫。

我正在使用 VS2010 SP1、C#/.NET 4 针对 MSSQL 2008 测试在 Win7 x64 上本地运行的 MVC2/3 应用程序。

底层测试是一个单元测试,它执行一个单一的 MVC 控制器方法,它使用 Unity 和其他 Ent-Lib 库根据用户的权限从数据库中拉回一组客户端。单元测试的典型执行时间为 0.4 到 0.6 秒。

负载测试设置为暴露性能问题并运行 10 分钟:

  • 初始用户数:1
  • 步骤持续时间:30
  • 步用户数:1

观察:

  1. 对于单个用户的前 30 秒,执行有点不稳定。第一次测试需要 3 秒,这是正常的热身。接下来的 15 秒左右大约需要 0.4 秒,这是完美的。然而,就在 10 秒后,测试开始运行 5 秒。这是第二个虚拟用户出现之前。随着更多虚拟用户的加入,测试时间逐渐增加,这是意料之中的,尽管运行时间似乎仍然很长。

  2. 更令人担忧的是,用户 6 附近的 CPU 利用率会飙升(之前所有 8 个内核的平均利用率约为 20%)。在用户 6 和 7 处,CPU 达到 70%,并由用户 8 在 8 个内核上固定为 100%,并一直保持到 10 分钟后测试结束。不用说,对于一个正常的步进测试,我想从 10 个并发用户开始,然后增加到 100 个或更多,但我的 CPU 以 100% 开始,结果肯定不准确。

Cuprit 显然是 QTAGENT.EXE,正如我从执行任务中看到的那样。它使用我所看到的每个空闲 CPU 周期。我也在 32 位模式下运行了这个负载测试,并且 QTAGENT32.EXE 运行类似。

我不知道为什么会遇到这个问题,更不用说该怎么办了。任何建议或解决方案都值得赞赏。蒂亚!

编辑

我发现解决我的问题的方法是通过单击“调试测试”而不是“运行测试”来启动负载测试。这对我来说真的没有任何意义,事实上它就像我所期望的完全相反;但是,我不能否认它一直在与 100 多个用户一起运行我的测试,并且只对我的 CPU 进行半抖动(平均约为 50% 的峰值)。

4

3 回答 3

5

QTAgent 是执行所有负载测试工作的代码。它遍历每个执行测试的虚拟用户。

与测试代理 CPU 挂钩的一个原因是您的网站正在快速返回结果。模拟这种情况的一个好方法是加载测试一个静态 html 页面,或者请求一个被 IIS 很好缓存的页面。

检查测试的每秒请求值。该值是 QTAgent 需要完成多少工作的合理衡量标准。

对于每个测试,您的 QTAgent 必须处理和发送一个 html 请求,记录接收到的测试并存储结果以及所有性能监控统计信息。

我建议下一步在每个单元测试之间添加 1 秒的延迟,这有望让您加载更多的虚拟用户。

也就是说,在同一台机器上托管的 Web 应用程序上运行负载测试无法在 CPU 停止运行之前处理很多虚拟用户。

您可以发布每秒请求的统计信息吗?

于 2011-10-19T20:40:27.490 回答
1

所以它归结为用户错误。原来我正在测试的控制器是超资源密集型的。我读到这是其他地方 CPU 使用率高的最可能原因,但我假设(哎呀)8 个并发用户访问这个特定的控制器不可能锁定我的 CPU。不,事实上,我们的代码运行起来非常昂贵,8 个用户同时请求该页面将使其最大化。感谢所有的建议。

于 2011-10-27T15:11:10.123 回答
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 吗?也许它不像其他版本那么强大。

于 2011-10-19T19:38:46.533 回答