LR:进行负载均衡测试的正确姿势!

编者按:

原文来自于测试之道杂志,小编对原文进行了较多改动。一是因为原文有一些无关紧要的内容,二是当时的编辑似乎直接把谷歌翻译的内容发了出来,语句不通顺,语法错误连篇,看了很长时间仍然云里雾里。

另外由于图片不好替换,所以阅读本文时请忽视图片中的文字错误。以下是正文,若文中有错误,欢迎留言指教。

本文目的

以下是解释为什么用 Load Runner 做系统级负载测试时需要大约 6 个负载生成器。

摘要(怎样进行真正的负载均衡测试)

  • 不要用 ip 欺骗做负载均衡(使用多台机器)。
  • 在每次测试之前设置负载均衡器虚拟用户配额。
  • 负载生成器是逐个启动虚拟用户,而不是并发。
  • 在场景配置管理中将负载生成器分组。

问题

下图是当 IP 欺骗器运行用户时负载的状态截图(2台负载机和2台web服务器),可以看出来前面很长一段时间负载并不均衡。

从图中可以看出来,只用两个负载生成器来获得高用户负载的测试是可能的,但测试执行时间会很长,并且需要去除前面的不均衡的部分。

同时我们也可以从中看出2个问题:

  1. 为什么当开启IP欺骗时负载均衡不按预期工作,场景开始执行后很长一段时间内web02没有收到请求?
  2. 如果使用多于两个负载生成器会发生什么,系统级的负载测试使用多少台负载机合适?

1、负载机工作机制:逐个启动虚拟用户而非同时

LoadRunner 逐个的增加每个负载生成器的虚拟用户,增加方式不是在负载生成器 1 上启动第一个用户再在负载生成器 2 上启动第二个用户,而是先运行负载生成器1上的用户,运行完如果还有更多用户,LR再跳到负载生成器2上启动其他用户。换句话说,如果我们在两台负载生成器上运行 100 个虚拟用户,最先的 50 个用户会在第一个负载生成器运行,然后再在第二个负载生成器运行剩余的50个用户。

如果有两个web服务器和两台负载机,就会出现图2中的情况。另外可以通过查看 Load Runner 的负载生成器状态对话框来确认用户运行情况。

看起来似乎有点麻烦,那么能否使用一台负载机来进行负载均衡测试呢?答案是不能。

在系统级负载测试中需要多个负载生成器的原因:

LoadRunner 的“WAN 欺骗”技术(多个 IP 被分派到一个网卡),工作原理只是在请求头部加上IP地址,以此来绕过某些系统的IP唯一限制。而负载均衡器的规则是使用物理地址而非IP,我们都知道每台机器的物理地址都是唯一的。如果只通过一个负载机来测试,意味着所有请求的物理地址都是同一个,此时无论设置多少并发,负载均衡器都会当做这些请求来源于同一个用户,并把所有请求都发送给同一台web服务器,即使此时拥有多台web服务器。

能否让每个请求都对应不同的物理地址呢?答案是否定的。LR 的 WAN 欺骗不能指派不同的物理地址。

换言之,LoadRunner的欺骗可以用于少量用户、少量脚本的功能测试,但是不适用于负载均衡。

但在一篇2007年的文章中看到了不一样的解释:

在这种情况,负载均衡器跟我们访问量的源 IP没有关系,是名称分解工作的机制导致的。当第一个虚拟用户启动,LR 开始从一个 URL 执行脚本,LR 传递 URL 到操作系统,依次传送名称分解请求(利用操作系统的 TCP/IP 栈)到负载生成器的DNS 服务器,作为定义它的网络配置。一旦名称被解析,IP 地址就存储在 DNS 的缓存中,这是操作系统的功能而不是 LoadRunner 完成的,负载生成器的 DNS 缓存为 LoadRunner 增加的每个用户提供 IP 地址,因此我们会看到请求于来源于不同的 IP 地址,但是我们只解析了第一个虚拟用户第一次的名称,所以我们永远不会得到另外的 IP 地址。

在这个场景中,我们需要借助 2 台不同机器来获取 2 个真正名称解析的请求。我们也需要保证在第一个负载生成器的请求中间没有其它用户发送请求。否则,我们第二台机器就会制造第 3 次请求(由 DNS 服务器的透视图)并且获取和第一个负载生成器一样的 IP 地址,这就导致无法实现真正的负载均衡。

所以,IP 欺骗不是实现负载均衡的解决方法。

看完以后我疑惑了:

到底是按照物理地址还是IP工作?如果web服务器是单数,按照这个说法岂不是仍然不能达到真正的负载均衡?

2、系统级负载均衡使用多少台负载机?

这方面笔者经验较少,不能给出一个准确答案。不过从上面的介绍就可以看出来,使用更多的负载生成器,LoadRunner 切换下个负载生成器的时间就越少,负载生成器越多切换就越快。原文中给出的答案是4-6台最好。

是不是只要设置多台负载机,就能实现负载均衡测试呢?

不是,还需进行以下操作:

  • 为每台负载生成器设置虚拟用户配额,否则一台生成器趋向于运行所有负载(会导致负载不均衡)。
  • 每个脚本对应的负载生成器,应该是一个分组而非单个的生成器。

1)每个负载生成器运行时必须设置配额

默认情况下,LoadRunner 为每个负载生成器设置 500个虚拟用户。这意味着如果你不修改默认值,那么当你在两个负载生成器上运行100 个用户时,所有用户会在同一个负载生成

器中运行,并且负载生成器会将这些请求解析为一个用户,并将所有请求送到一个 web 服务器。

下面是设置配额的截图:

如果希望达到负载均衡,那么每次改变虚拟用户数时这个配额必须设置。

2 ) 对负载生成器分组

这是为了在负载生成器多于一个时,可以让每个脚本平均分布,达到真正的负载均衡。我们不希望脚本“A”的请求总是并只是发送到 web 服务器“1”,而是希望脚本 A、B、C 的请求平均发送到 web服务器 1 和服务器 2 上。对web服务器来说,只有请求IP不同才能实现这种情况。为了强制一个脚本在多于一个负载生成器上运行,就需要在 Load Runner 场景管理中把负载生成器“分组”。

按照以下步骤设置负载生成器的:

  1. 将场景改为百分比模式。
  2. 设置脚本使用“所有生成器”(只有改了模式才能操作)
  3. 打开Scenario->Covert Scenario to Percentage Mode。
  4. 点击“Generators”按钮。
  5. 在“Load Generators”对话框,对要用的负载生成器分组。
  6. 重新选择生成器,取消选择“Convert to %mode” (或 “Convert Scenario to Vuser Group Mode”)。
  7. 重新选择每个脚本虚拟用户的数量。

注意:每个脚本分配的虚拟用户必须多于一个,否则该脚本会被指派到一个唯一的负载生成器。

使脚本的用户运行在两个负载生成器上:

本文分享自微信公众号 - 软件测试经验与教训(udatest)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券