Azure 负载测试。了解虚拟用户如何影响性能

Posted

技术标签:

【中文标题】Azure 负载测试。了解虚拟用户如何影响性能【英文标题】:Azure Load Test. Understanding how virtual users effect performance 【发布时间】:2017-03-03 19:50:14 【问题描述】:

我正在尝试理解最近一次 Azure 云负载测试的结果,我们针对我们的一个 API 运行该测试

在测试 API 时,我已将负载测试虚拟用户配置为没有思考时间。所以本质上,每次虚拟用户收到响应时,它都会立即发送另一个请求。

我们也没有使用任何类型的用户会话,也没有为每个用户缓存任何数据。这是一个基本测试,将一些 JSON 发布到 API 上的端点,然后对接收到的数据执行一些计算。

看来,通过改变虚拟用户的数量,我们可以让服务更高效。我的意思是,它可以更快地响应并且仍然每秒处理更多请求。

两个负载测试的结果如下所示。

第一个测试告诉我,我们的 API 能够在 2 分钟内处理 60k 个请求。

我无法理解的是,为什么添加更多虚拟用户会增加平均响应时间并降低 RPS,从而导致 API 在 2 分钟内仅处理 55k 请求。

为什么 API 现在只能处理 460 RPS,而我们已经知道它可以处理 500 RPS?

【问题讨论】:

【参考方案1】:

这里有3个问题: 1.为什么更多的虚拟用户会增加响应时间; 2.为什么更多的VU会降低RPS; 3.为什么更多 VU 会减少总请求数。

解释如下:

    更多并发 VU 会创建更多并发会话,这需要服务器上的更多资源(例如会话上下文、队列大小、线程并发),从客户端的角度来看,这会增加服务器处理时间和响应时间。

    仅当负载生成器以与接收响应无关的恒定频率发出请求时,在这种情况下降低 RPS 才会不一致。实际上,在发出请求后,每个 VU 都会等待,直到收到响应。由于服务器响应变慢,等待时间增加,导致 RPS 下降。 这个问题有第二个答案。由于负载生成器的性能容量有限,模拟更多 VU 需要客户端上的更多资源,这可能会导致发出请求的延迟。当您将测试配置为零思考时间时,负载生成器可能会无意中注入延迟,从而导致额外的 RPS 降低。

    请求总数与 VU 和 RPS 的数量成正比。显然,在您的情况下,RPS 减少产生了更大的影响,并且总请求数减少了。

通常情况下,负载测试中增加 VU 所导致的 RPS 降低效果看起来像是一个悖论,但实际上并非如此。

【讨论】:

我在服务本身内部有一些性能计数器,所以我可以看到当有更多用户时服务需要更长的时间来响应。所以我不认为负载生成器无意中在我的测试中注入了延迟。正如您所建议的,这可能与更多当前会话有关。我会继续挖掘。谢谢【参考方案2】:

没有“确切”的单一原因,但请记住,随着负载生成器数量的增加,连接数量、服务器上并行操作的数量等也会增加。您不能假设,通过随着时间的推移增加用户负载,您将继续获得更好的吞吐量和响应时间。事实上,有时您会增加负载并在性能图上发现难以捉摸的“曲线拐点”——延迟峰值(以及请求失败),而吞吐量下降。从负载测试的角度来看,这将是一件好事,因为您现在对现有软件+基础设施在交易率等方面的期望有了相当好的了解。

您需要进一步深入研究以确定确切原因,但这很容易与线程池耗尽、内存问题、cpu 问题、磁盘问题、特定资源(例如缓存或数据库)的瓶颈、网络有关饱和度等。

【讨论】:

“您现在对现有软件+基础设施在交易率等方面的期望有一个相当好的想法”就是这样,现在我不知道。我进行负载测试是因为我想确保 API 能够应对 500 RPS。从技术上讲,第一个测试处理了 500 RPS,没有问题并且响应迅速。我不知道,虽然生活环境会更接近。 200 个虚拟用户或 300 个虚拟用户。

以上是关于Azure 负载测试。了解虚拟用户如何影响性能的主要内容,如果未能解决你的问题,请参考以下文章

Azure创建4层SLB运行网站

Azure技术12-高可用--在Azure上创建典型高可用架构应用

使用 Visual Studio 2013 进行负载测试,将参数传递给虚拟用户

性能和负载测试

如何在运行时更改JMeter的负载

Visual Studio 2010 如何在负载测试中管理虚拟用户?