Avalanche-Think time的前世今生

Avalanche测试仪推出至今,思博伦的工程师团队不断的赋予其新的功能,新的用法,致力于提供先进的第4至7层测试覆盖能力,提供更强健并经过彻底测试优化的解决方案。

以四层测试中最常见的4层并发连接数测试为例(后文简称并发测试),熟悉Avalanche的工程师都知道,早期用Avalanche测试仪进行并发测试的实现方式是通过在服务器侧增加时延(Latency)的方式进行测试的。具体的用法如下:

在服务器侧的Transactions 标签页配置时延(Latency),服务器在收到客户端的HTTP请求后,会根据配置的时延参数(Latency)延迟响应客户端的请求,通过配置不同的时延,我们可以达到控制TCP连接生命周期从而实现并发测试的目的。

以时延5秒为例:

我们在Server->Transactions标签页配置Latency等于5000ms,运行测试并抓包:

通过抓包,我们不难发现,在测试开始后,客户端与服务器快速的完成了TCP连接的建立并发送了HTTP的GET请求。服务器根据配置的时延(Latency)延迟了5秒钟进行响应,客户端收到响应后关闭了连接。该TCP连接的生命周期被精确的控制在5秒钟的时间。

不难看出,通过时延(Latency)的方式测试并发连接数的优点是配置简单,直观易懂,容易控制,缺点是使用起来不够灵活,无法配置动态参数,并且无法完全模拟用户的真实行为。一般来说,真实的用户行为是打开网页->浏览页面->跳转到新的页面或者关闭页面。也就是说,用户延迟关闭连接的行为是在收到了服务器响应以后发生的,而不是在收到服务器响应之前。为了解决以上几个问题,“Think time”应运而生。

顾名思义,“Think time” 旨在模拟用户的思考时间,我们可以使用“Think time” 来实现完全模拟用户浏览网页的这一过程。“Think time” 允许我们在Action 列表里面进行引用,模拟用户访问页面后暂停一段时间,然后继续进行下一个页面的访问或者关闭页面的操作。我们还可以对 “Think time” 进行全局或者动态的配置。

注意:“Think time”生效的必要条件是在Client Profile->HTTP:User标签页勾选User Think Time,同时需要在Client Profile->HTTP:Browser选择HTTP1. 1版本并勾选Persistence。

由于Think time是客户端的行为,因此,如果进行并发测试不勾选Persistence,客户端的HTTP GET请求会携带“Connection: Close”的Header,服务器完成响应后会主动关闭该连接,该TCP连接的生命周期不会受到Think time控制;

关于Think time的具体用法,我们举几个例子加以说明:

1

假如我们希望构造一个用户访问页面后暂停10秒时间,然后关闭页面的测试:

首先需要在Client->Profile界面勾选User Think Time复选框

注意:复选框中的时间与Action中插入的时间作用相同,属于全局配置,如果与Action list中的Think time参数同时配置(动态配置),则两个时间会同时生效,产生叠加效果;

在Client Profile->HTTP:Browser选择HTTP1. 1版本并勾选Persistence:

Client->Actions列表配置如下:

1 get http://192.168.1.1/index.html

THINK ##尖括号内的时间值以ms为单位

运行测试,然后查看抓包:

通过抓包我们能看到客户端在收到了服务器响应的200 OK后,“Think”了10秒钟后才关闭了连接。

2

“Think time”支持变量引用,我们也可以使用变量引用10秒的“Think time”时间,如:

ASSIGN VARIABLE

1get http://192.168.1.1/index.html

THINK

这样的配置测试效果和例1的测试效果是相同的,本文不再加以赘述;

3

使用创建的表单数据引用“Think time”:

ASSIGN VARIABLE

1get http://192.168.1.1/index.html

THINK

表单数据配置如下:

运行测试并抓包:

抓包查看测试结果,能够看到客户端每一次HTTP请求后,“Think”时间都是按照表单数据来执行的;

4

在“Think time”中引用随机数值:

ASSIGN VARIABLE

1get http://192.168.1.1/index.html

THINK

通过抓包我们能够看到,客户端每次请求得到服务器回应后“Think”的时间都是不同的,这里由于随机数配置的是“###”,因此随机出来的参数是XXXms;

如果我们修改Action为:

ASSIGN VARIABLE

1get http://192.168.1.1/index.html

THINK

运行测试并抓包:

通过抓包我们能够看到,客户端每次请求得到服务器回应后“Think”的时间是以个位数的秒为单位进行随机的,以此类推,我们可以配置任意量级的随机数“Think time”;

5

在一定范围内随机“Think”:

ASSIGN VARIABLE

1get http://192.168.1.1/index.html

THINK

通过抓包,我们不难看出,每一次的“Think”时间都是在10-30s之间浮动的;

6

在两个Level 1的Action之间引用“Think time”:

1 GET http://192.168.1.1/index1.html

THINK

1 GET http://192.168.1.1/index2.html

通过抓包我们能够看到客户端在完成一次请求后,“Think”了5秒的时间,然后发起了第二次请求;

思考:

如果我们调整Action,让客户端两次请求访问不同的服务器,会是什么效果呢?

01

1 GET http://192.168.1.1/index1.html

THINK

1 GET http://192.168.1.2/index1.html

运行测试并抓包:

通过抓包,我们能够看到,客户端在收到服务器200 OK的响应后,并没有马上关闭连接,客户端的第二个动作也并没有马上执行,而是“Think”了5秒钟后,客户端才开始执行第二个Action动作,同时关闭了第一条连接。这里如果我们像前文提到过的,不去勾选HTTP的persistence选项,则这两个GET是串行执行的,即客户端完成第一次请求并关闭连接,“Think”5秒钟然后继续执行第二个GET;

7

在Level 1和Level 2的Action之间引用“Think time”:

注意:“Thinktime”只生效于下一个Level 1的Action前面,即使我们把它插入在Level 2的Action前面。

Level表示请求的对象是针对第1级的Web页面还是针对页面上的第2级嵌入式对象,如链接和图形。第1级模拟用户实际的人工点击,第2级模拟浏览器随后检索嵌入式URI(统一资源识别符)。例如,一个网站的主页可能包含几个图像文件,当您单机主页的链接时,浏览器会自动检索这些文件。

如:

1 GET http://192.168.1.1/index1.html

THINK

2 GET http://192.168.1.1/index2.html

2 GET http://192.168.1.1/index3.html

1 GET http://192.168.1.1/index4.html

1 GET http://192.168.1.1/index1.html

2 GET http://192.168.1.1/index2.html

THINK

2 GET http://192.168.1.1/index3.html

1 GET http://192.168.1.1/index4.html

1 GET http://192.168.1.1/index1.html

2 GET http://192.168.1.1/index2.html

2 GET http://192.168.1.1/index3.html

THINK

1 GET http://192.168.1.1/index4.html

通过以上三组测试及抓包结果来看,Level 1和Level 2之间即使插入了“Think time”,“Think time”也只会生效于下一个Level 1的Action前面;

8

多个“Think time”叠加使用:

1 GET http://192.168.1.1/index1.html

THINK

THINK

THINK

1 GET http://192.168.1.1/index2.html

通过抓包我们能够看到,当多个“Think time”被叠加使用的时候,配置的多个“Think time”均会生效;

9

使用Think time控制并发连接数:

测试预期:以每秒新建连接数1000的速率实现10000并发连接数的测试效果;

测试配置思路:配置Avalanche在测试开始后10秒内(爬坡时间)生成10000个模拟用户(每个用户产生一条连接),这里新建速率等于10000 connections/10 s=1000 connections/s。每个用户的Think time时间为10秒(Think time的时间与系统爬坡时间相等,使整个测试过程中的新建速率始终保持为1000)。

Action list配置如下:

1 GET http://192.168.1.1/index1.html

THINK

Load 配置如下:

查看测试结果,能够看到整个测试过程中新建连接数的速率始终保持在1000 connections/s,并发连接数在测试开始10秒后保持在10000 connections:

S

pirent Support

至此,我们介绍了“Think time”的多种实际用法,包含了全局、动态等多种使用场景。在实际的运用中,“Think time”也不仅仅是并发测试的专利,我们通过在Action列表中引用“Think time”参数,也是可以在其他协议的测试中让“Think time”生效的。验证测试,不靠猜测。希望本篇文章可以帮助到您,使您在今后的测试工作中能够更加灵活的控制客户端行为,确保解决方案能够在真实的用户流量条件下实现应有的性能、规模和安全性。

关键字:Avalanche Think time 并发测试 Action list 思考时间 变量 随机参数 HTTP 连接保持 Simuser

联系我们:

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190214G0CZ4W00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券