探讨LoadRunner的并发用户和集合点
近来跟踪一个项目,发现同事们在执行性能测试时,比较热衷于使用集合点,从概念上认为要得到并发用户就必须设置集合点,认为在执行一个压力测试脚本时,设置了集合点才算是有效的并发用户,没有设置结合点,就认为可能这个就不能准确的代表并发用户数。当前我并反对这个观点,不过却让我有一种疑虑,促使我想更深入的理解并发用户和集合点,我相信大多数进入性能测试研究领域的朋友都应该有疑惑,主要原因我觉得还是由于不能深入理解LoadRunner的实现原理,而且缺乏对系统整个过程的分析,其中这里面涉及到的知识包括网络、协议、中间件、数据库、应用层以及缓冲区和缓存等等,当然还与硬件资源CPU队列和内存等有着千丝万缕的联系。所以说要成为一个优秀的性能测试人员,真还不一个容易的过程,是需要长时间积累和学习的,只有通过大量的项目实践和分析,最后再总结于思想,才有可能成为这个领域的专家,当然也希望真正想把性能测试做好的朋友都能为此将不懈努力,乐于分享和讨论。
先来看一个应用系统的结构图,如下所示:
这个图源于小布老师的视频中,比较直观、简洁地反映了一个应用系统的运行过程,其中包括客户端、网络、应用服务器和数据库服务器,其中每一个环节都是在执行性能测试分析中必不可少的元素,结构图中也合理得分析出了响应时间的处理过程,当请求从客户端发出之后到最后返回到客户端,这个过程中每一个环节的处理都有可能最后成为系统运行中的性能瓶颈,所以可见对系统整体结构的理解是何等重要。
接下来我们来看看关于并发用户和集合点的定义:
并发用户:通俗意义上讲就是同时操作的用户,当然这个“同时”可以理解为同一时间段,还可以理解为同一时间点,当然如果说并发就是同一时间点上同时操作的用户,这样理解没有错误,但对于实际情况来讲,是没有严格意义上的并发执行的,就如同进程和线程关系一样,在某一个点严格上讲就只有一个人得到执行的权利。
集合点:用以同步虚拟用户,以便恰好在同一时刻执行任务。这个从概念上来讲,其实也是比较模糊,正因为模糊,使用才值得去深入探讨。对于LoadRunner来说,集合点只是一种策略,而这个策略也会有很多规则,因为实际情况中并非所有用户都会同时到达集合点,上面的那个结构图就能解释这个误解,因为从客户端发出到网络、中间件、应用层再到数据库,这其中的每一个环节都有延时,也就是说不可能所有的用户都能到达所谓的集合点,才开始同时执行操作。
从上面的两个概念的理解来讲,有人就会思考,并发用户和集合点到底有没有关系,这才是关键。当然这个就要看需求是什么了,所以说很多时候我们误用集合点和并发用户,其实根本原因在于对需求的理解,需求本身都没有搞清楚他想实现的场景,得到什么样的结果。当然,我们只能感慨需求并是专业的技术人员,至少我们大多数人碰到的需求都不一定是技术出身,所以他们不明白,我们就不能装忽悠,不然结果就肯定不符合实际了。
通常情况下,我们会得到用户这样的需求“本系统要达到并发用户200”,这种需求从严格意义上来讲是不合格的,因为对于一个系统来说有很多个功能,比如系统登录、注册、查询、删除等等,是要求登录达到200,还是所有功能总共达到200,因为当用户进入系统之后,有些用户在执行注册,有些用户在执行查询,是否可以并行操作,也是所谓的并发,所以说要理解集合点和并发数,从根本上就应该更清晰的理解业务流程,只有把业务分析清楚了,方才可以合理的使用集合点,正确的理解并发用户数。
当然,就我个人来讲,我是很少使用集合点的,因为通过LoadRunner的理解,我认为LoadRunner本身就已经在模拟实现一个并发的过程,而增加集合点设置只是为了并实现严格意义上的所谓的并发,而实际是这个集合点的设置也并非绝对达到了这个目的,结构中的过程就可以证明。当然为此我也通过一些实例来做验证,以下是对Mercury web Tours网站首页,录制访问过程,脚本如下:
脚本 1:设置集合点
Action()
{
lr_rendezvous("同步访问web页面");
lr_start_transaction("start");
web_url("mercuryWebTours",
"URL=http://192.168.3.34:1080/mercuryWebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
lr_end_transaction("start", LR_AUTO);
return 0;
}
脚本 2:不设置集合点
Action()
{
web_url("mercuryWebTours",
"URL=http://192.168.3.34:1080/mercuryWebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
return 0;
}
在相同场景实际中执行两个脚本之后,发现其响应时间其实误差很小。当然,这只是我实践中的一个,近期做的其他项目中,包括C/S和B/S都有的,我也都有实践过,期待有兴趣的朋友也可以实践验证哈,分享结论。
以上我只是想表达的一个观点就是,并不是集合点在我们的性能测试中没有作用,如果没有作用我相信设计LoadRunner的公司也不会给出来,而是要理解如何选择去用它,这才是关键。之前我们就讲到过,在一些业务流程比较复杂的应用程序测试中,我们就必须要使用集合点,比如一个企业系统中业务是这样的:用户登录进入之后,一部分人在完善个人资料,一部分人在查询数据,另一部分人在执行删除操作,还有一部分来发送消息等等。就这样的一个业务中,在模拟执行性能测试时,就必须明确并发用户跟集合点的关系,在实际录制脚本的时候,我们就需要把这个业务分割成多个事务,然后分别对各个不同的事务要设置集合点,为什么此时要使用集合点呢,因为我们必须分析出每一个事务的并发情况,加入200个用户进去之后,我们就这样放任去这200个用户自由去操作,就不能判断出查询并发数多少、删除并发数多少、发送消息的并发又是多少,因为进入系统之后,没办法确定200个用户都同时干了些什么,所以此处才是集合点使用最合理的地方。至于,我为什么很少使用集合点,也源于此,因为通常情况我们主要是对单一业务进行压力测试,比如登录或者是注册,单一功能就如同上面的那个访问web页面一样,脚本只有一个操作,此时对于LoadRunner来讲,其实有没有设置集合点效果不大,而且为了模拟能更加接近去实际情况,当然这也是要做实际分析的。
这里我还要个举例子,比如,一个OA系统,要求并发用户数200,而我们的场景设置是这样的,200个并发用户平均每10s加载5个用户,大约运行半小时,此时执行的场景,我们可以结合实际情况进行分析:根据实际情况得出,通常登录OA系统的的用户大部分都在早上上班9:00~9:30,此时是一个时间段,而并非一个时间点,使用我们的模拟场景是完全符合实际需求的,所以得出结论是在30分钟的时间内,我们的OA系统可以允许200个用户同时进行登录操作。由此可以说明,任何需求的提出都必须从实际环境来考虑,我们在设置场景时也必须反映出实际情况,才能模拟出更接近真实的场景,得出来的结果才更有价值。
当然,性能测试的执行应该是有目的,通常是为了调优,也有的是为了评测
在以评测为目的的性能测试中,用户更关心的是业务上的并发,其实是真实业务场景的并发情况,这种情况下就不需要设置集合点了。
集合点是一种特殊情况下的并发,通常是在以调优为目的的性能测试中才会用得到,主要是为了有针对性地进行施压,以便找到性能瓶颈。
以上纯属个人理解,期待拍砖!
探讨LoadRunner的并发用户和集合点的更多相关文章
- LoadRunner并发用户和集合点的深入讨论
看到51上三个高手Zee, 大漠飞鹰,xingcyx的一场非常精彩的关于并发用户数和集合点的讨论,很有意义.如果对这两个概念不清楚的朋友,一定要仔细领悟了. 故事开始于xingcyx的一番话: 声明: ...
- LoadRunner之并发用户数与迭代关系---并发数与迭代的区别
Q1: 例如在LR里,我要测100个用户同时并发登陆所用时间,那我是不是在录制好脚本后,需要参数化“用户名”,“密码”以及在那个记事本里构造100个真实的用户名和密码? 然后运行Controller, ...
- jmeter系列-如何实现像loadrunner一样,多个并发用户先通过登录初始化,然后做并发的接口性能压测
自动转开发后,就很少关注性能测试方面的东西,最近在帮朋友做一个性能压测,由于朋友那边的公司比较小,环境比较简单,而且是对http服务进行的压测,所以最终 选用了jmeter来实现这个压测. 如下就是我 ...
- loadrunner中并发数与迭代的区别
你的理解的虚拟用户应该是 迭代次数 ,录制脚本时只会有1个虚拟用户,1个虚拟用户可以有多次 迭代,也就是 重复执行 Action里面的内容,在场景设置的时候,如果你说的10时在runtime-sett ...
- 搭建LoadRunner中的场景(二) 集合点
Rendezvous: 这个单词来自于法语,军队集合的意思.LoadRunner中是指各虚拟用户在同一时刻完成指定的操作. 一. 集合点设置步骤 1. 在脚本中需要测试并发性能的操作之前加入集合点. ...
- 如何利用JMeter模拟超过 5 万的并发用户
本文将从负载测试的角度,描述了做一次流畅的5万用户并发测试需要做的事情. 你可以在本文的结尾部分看到讨论的记录. 快速的步骤概要 编写你的脚本 使用JMeter进行本地测试 BlazeMeter沙箱测 ...
- 硬核!如何模拟 5w+ 的并发用户?
来自:http://t.cn/ES7KBkW 本文将从负载测试的角度,描述了做一次流畅的5万用户并发测试需要做的事情. 你可以在本文的结尾部分看到讨论的记录. 快速的步骤概要 编写你的脚本 使用JMe ...
- 转:LoadRunner响应时间与用户体验时间不一致问题的深入分析
在新一代一期项目非功能测试过程中,我们发现了LoadRunner测试响应时间与客户端实际用户体验时间不一致的现象.例如员工渠道上线后,客户体验时间远远超过了LoadRunner测试响应时间.本文针对这 ...
- "并发用户数量"的正确英文表示
并发用户数量the number of concurrent users 最佳并发用户数量the optimum number of concurrent users 最大并发用户数量 the max ...
随机推荐
- 杭电oj1717——小数化分数(java实现)
question:小数化分数2 思路: /** * 这道题没有整数部分(有也无所谓,算小数部分,算完了分子分母按倍数加上就好),也就是说数组直接从a[2]开始后面是小数,我把这道题分为了三类: * * ...
- [JSOI2016]最佳团体 DFS序/树形DP
题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...
- 【Python】循环的拓展
- C语言结构体理解
本质就是数学中集合,里面变量相当于元素,难点在于就是:以前做数学题都是别人给了一个集合,算里面的关系,编程不一样的就是,自己定义一个集合.
- [SDOI2016] 生成魔咒 - 后缀数组,平衡树,STL,时间倒流
[SDOI2016] 生成魔咒 Description 初态串为空,每次在末尾追加一个字符,动态维护本质不同的子串数. Solution 考虑时间倒流,并将串反转,则变为每次从开头删掉一个字符,即每次 ...
- Paper: A novel visibility graph transformation of time series into weighted networks
1. Convert time series into weighted networks. 2. link prediction is used to evaluate the performanc ...
- js清空子节点
删除全部子节点 function removeAllChild(){ var div = document.getElementById("div1"); while(div.ha ...
- os 和shutil模块的使用方法
1.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法. 1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 2.返回指定目录下的所有文件 ...
- Python - python3.7新增的contextvars vs Thread local(threading.local)
总结 和threading.local()类似.Python3.7新增. thread.local(): 不同线程,同一个变量保存不同的值. contextvars: 不同上下文,同一个变量保存不同的 ...
- MySql -- default 默认约束
常用数据库约束: 一.default 默认约束: 二.not null:非空约束,指定某列不为NULL: 三.unique:唯一约束,指定某列和几列组合的数据不能重复: 四.primary key:主 ...