loadrunner 脚本优化-事务时间简介
脚本优化-事务时间简介
by:授客 QQ:1033553122
事务概念
事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容(脚本section)。定义事务来衡量服务器的性能,例如,你可以定义一个事务来衡量服务器处理查看账户余额和显示信息于ATM的请求时间。
事务时间
一个事务的时间是指持续时间,从开始到结束。对于一个事务时间来说,一般由4个部分组成:
响应时间
Wasted Time
Think Time
事务自身时间
a) 响应时间
这个是事务的目的,响应时间是通过记录用户请求的开始时间和服务器返回内容到用户的时间差值来计算用户操作响应时间的。
注:这里不包含客户端GUI时间,例如浏览器解释页面所耗费的时间
对软件来说,通过事务得到的系统响应时间也是由非常多的部分组成的,一般来说,响应时间由网络时间、服务器处理时间、网络延迟三大部分组成。先来看看当一个客户端发出请求到服务器返回需要经历那些路径
1.网络时间
客户端发出请求后首先通过网络来到Web
Server上(消耗时间为N1);
然后Web
Server将处理后的请求发给App
Server(消耗时间为N2);
App Server将操作数据指令发送给Database(消耗时间为N3);
Database服务器将查询结果数据发送回App
Server(消耗时间为N4);
App Server将处理后的页面发给Web
Server(消耗时间为N5);
最后Web
Server将HTML转发到客户端(消耗时间为N6)。
2.服务器处理时间
各个服务器处理所需要的时间WT、AT、DT。
3.网络延迟
最终响应时间=网络延迟时间+WT+AT+DT+(N1+N2+N3)+(N4+N5+N6)+WT+AT+DT
影响网络的因素一般包括以下内容:
1.前端Network
*DNS
Lookup
*Time
to connect
*Time
to first buffer
*Network
Time
*Download
Time
*SSL
handshake
*FTP
authentication
*Client
Time
*网络延迟
2
后端服务
*Web
Server
--Servlet
Time
--Method
Time
--静、动态压缩
*App
Server
--EJB
Time
--Method
Time
--JNID
Lookup
*Database
Server
--JDBC
Time
--Connect
Time
--Execute
Time
注意:通过事务可以获得每个操作所消耗的准确时间,例如查询、登录、删除操作。但是对于性能分析来说,这个时间还是太长了,无法有效解帮助我们定位性能瓶颈!lr目前也只能对自己发出的请求和服务返回的内容进行网络级别的分析,也就是说lr能够分析的时间为客户端到www
web服务器的时间N1和web服务器返回到客户端的时间N6。这个时间和网络速度有关,可以用lr的专用词Web
Page Breakdown来解释。也就是说VuGen可以分析的时间至有客户端到Web
Server之间的部分,后面从Web
Server到App
Server,再到Database
Server的时间只能得到一个总和。
b)
事务自身时间
事务中哪怕没有操作,也是需要时间的,不过这个时间一般是在0.01秒左右,所以可以忽略。
lr_start_transaction(“thinktime”);
lr_end_transaction(“thinktime”,LR_AUTO);
运行脚本后,控制台输出如下:
Action.c(3):
Notify: Transaction "thinktime" started.
Action.c(4):
Notify: Transaction "thinktime" ended with "Pass" status (Duration:
0.0095).
c)
思考时间
Think
Time是LoadRunner提供的一种模拟用户等待的方式,通过lr_think_time()函数实现。在函数内写入对应的时间(单位是秒),当脚本在Controller中运行到该函数时就会等待相应的时间。注意在VuGen中,回放Think
Time默认关闭。
Think
Time在进行性能测试时需要打开,只有这样每个虚拟用户才真正按照用户的操作速度来完成请求,才能得到真实情况下的系统数据。如果不打开Think
Time,测试获得的数据是在全负载下的一些理论峰值数据。
那么Think
Time在事务中如何影响事务时间呢?
lr_start_transaction(“thinktime”);
lr_think_time(5);
lr_end_transaction(“thinktime”,LR_AUTO);
在Run-time
Settings中设置Think
Time,启用Replay
Think Time功能,运行之后可以看到以下结果:
Action.c(3):
Notify: Transaction "thinktime" started.
Action.c(4):
lr_think_time: 5.00 seconds.
Action.c(5):
Notify: Transaction "thinktime" ended with "Pass" status (Duration:
5.0181 Think Time: 4.9993).
所以Think
Time会被算在事务的时间内,不过在Analysis中可以设置过滤规则将其扣除,另外我们建议尽量不要在事务内使用lr_think_time()函数。
d)
浪费时间(Wasted
Time)
在使用事务的时候,经常会看到在事务日志中有Wasted
Time,Wasted
Time是指事务中应该扣除的由于其他原因导致的时间浪费。如下:
Action()
{
lr_start_transaction("mainpage");
web_url("51testing","URL=http://bbs.51testing.com",LAST);
lr_end_transaction("mainpage", LR_AUTO);
return 0;
}
运行结果:
运行结果说明事务(打开51testing页面)所花费的时间为Duration=1.2395秒和事务结束的状态(Pass)。
在默认情况下,LoadRunner会将自身脚本运行浪费的时间自动记录Wasted
Time,例如执行关联,检查点等函数的时间。
除了脚本自身浪费的时间,某些时候使用C语言等外部接口进行处理所消耗的时间也会影响事务的时间,这个时间LoadRunner无法处理。这种情况lr无法处理,需要人为地计算第三方时间开销,并且将这个开销的时间记入Wasted
Time中,例如:
Action()
{
int i;
int num=1000; //循环迭代次数
char dude[1000];
double time_elapsed; //处理循环的时间
double wasteTime; //浪费时间
double transaction_time; //事务自身时间
double totalWasteTime; //总的浪费时间
double test;
merc_timer_handle_t timer; //定时器
//开始事务
lr_start_transaction("Demo");
timer=lr_start_timer(); //开启计时器
for(i=0;i<=num;i++)
{
sprintf(dude,"This is the way we waste time in a
script=%d",i);
}
//获取处理循环的时间(以秒为单位)
time_elapsed =lr_end_timer(timer);
//换算为毫秒
wasteTime= time_elapsed * 1000;
//获取事务自身时间,以毫秒为单位//注意,该语句必须放在事务中间,即事务结束之前
transaction_time = lr_get_transaction_wasted_time("Demo") *
1000;
//获取事务的持续时间并输出,以秒为单位
//test=lr_get_transaction_duration("Demo");
//lr_output_message("�", test);
lr_end_transaction("Demo", LR_AUTO);
totalWasteTime = transaction_time +
wasteTime;
lr_wasted_time(totalWasteTime);
return 0;
}
其中lr_start_timer()是一个LoadRunner自带的时间计数器,它和lr_end_timer()相对应,能够返回这两个函数间的时间差。
为了确保响应时间的正确,需要扣除在运行脚本时自身的时间消耗,事务中尽量避免出现非请求的处理内容,如果无法避免请,使用lr_wasted_time()函数将多余的时间开销扣除。
注意:在计算Wasted
Time时不要直接使用lr_wasted_time()覆盖,而忘了加上脚本中LoadRunner函数的自身时间。通过lr_get_transaction_wasted_time()函数可获得事务自身的Wasted
Time,将这个时间累加上第三方统计的Wasted
Time,再通过lr_wasted_time()函数覆盖。
阅读下篇:
loadrunner 脚本优化-事务时间简介的更多相关文章
- loadrunner 脚本优化-参数化之Parameter List参数同行取值
脚本优化-参数化之Parameter List参数同行取值 by:授客 QQ:1033553122 select next row 记录选择方式 Same line as,这个选项只有当参数多余一个时 ...
- Loadrunner 脚本优化-事务函数简介
脚本优化-事务函数简介 by:授客 QQ:1033553122 1.事务的开始和结束名称需要相同 lr_start_transaction(“transaction_name”); …//事务处理 l ...
- LoadRunner脚本优化之—参数化迭代介
在LoadRunner的脚本优化时,有时发送给服务器的请求参数化时,服务器返回的内容也会和参数化的内容相对应,例如发送的请求带有查询key=123,则服务器也会返回含有123相关的内容.这时我们在使用 ...
- loadrunner 脚本优化-参数化方法
脚本优化-参数化方法 by:授客 QQ:1033553122 方法一 1.确定需要参数化的内容 2.选中需要参数化的内容 3.右键选中的内容->Replace with a Parameter- ...
- loadrunner 脚本优化-加密与解密
脚本优化-加密与解密 by:授客 QQ:1033553122 密码加密 可以给密码加密,意在把结果字符串作为脚本的参数或者参数值.例如,完整可能有一个用户密码填写的表单,你想测试网站针对不同密码的 ...
- Loadrunner脚本优化-参数化之关联MySQL数据库获取数据
脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1. 安装MySQL ODBC驱动程序 O ...
- loadrunner 脚本优化-检查点设置
脚本优化-检查点设置 by:授客 QQ:1033553122 VuGen判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的是HTTP状态为200 OK,那么VuGen就认为脚本正确地 ...
- loadrunner 脚本优化-集合点设置
脚本优化-集合点设置 by:授客 QQ:1033553122 添加集合点(Insert->Rendezvous) 当一个集合点被插入,VuGen往Vuser脚本中插入一个lr_rendezvou ...
- loadrunner 脚本优化-参数化之场景中的参数化取值
脚本优化-场景中的参数化取值 by:授客 QQ:1033553122 Action() { lr_eval_string("{NewParam}"); lr_eval_stri ...
随机推荐
- 如何在vue中使用ts
注意:此文并不是把vue改为全部替换为ts,而是可以在原来的项目中植入ts文件,目前只是实践阶段,向ts转化过程中的过渡. ts有什么用? 类型检查.直接编译到原生js.引入新的语法糖 为什么用ts? ...
- 使用FormData格式在前后端传递数据
为什么一定要使用formdata格式……很大原因是因为当时我犯蠢…… 前端肯定是JS了,具体不写了,使用Postman测试,后端语言是Java,框架Spring Boot,使用IntelliJ IDE ...
- 阿里P8架构师讲述:3—5年程序员的发展和出路在哪里?
工作3—5年后,程序员们的成长将迈入一个全新阶段.这既是程序员们的黄金时期同时又是最迷茫的时期,因为大家必须要要思考一下今后的职业方向. 3—5年程序员的发展和出路在哪里? 是继续做技术人,还是向管理 ...
- [ncw7] 小睿睿的方案
考虑一对情侣(x,y)x<y的贡献,设in[x],out[x]为数的dfs序. 强制从x走向y方向 当in[x]<in[y]且out[y]<=out[x] 矩形{1,in[x],in ...
- django 模板层排序 class Meta 添加信息
class weeks(models.Model): #星期信息 stu = models.ForeignKey(students,on_delete=models.CASCADE) weeklist ...
- 用js如何获取file是否存在
其实注意点就可以知道了. 举个例子 firebug看出这代码: <div id="SWFUpload_0_0" class="uploadify-queue-ite ...
- 函数式编程之-定义能够支持Partial application的函数
是时候介绍如何在F#中定义函数了,在你没有接触过函数式编程语言之前,你也许会觉得C#/Java的语法已经够丰富了,有什么任务做不了呢?当你读过函数式编程之Currying和函数式编程之Partial ...
- MFC原理第三讲.RTTI运行时类型识别
MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...
- Ubuntu 下 Galera cluster for MySQL 集群安装
mysql galera cluster官网:http://galeracluster.com/documentation-webpages/ 相关安装教程:(不一定管用) http://blog.c ...
- HttpClient+Jsoup模拟登陆贺州学院教务系统,获取学生个人信息
前言 注:可能学校的教务系统已经做了升级,当前的程序不知道还能不能成功获取信息,加上已经毕业,我的账户已经被注销,试不了,在这里做下思路跟过程的记录. 在我的毕业设计中”基于SSM框架贺州学院校园二手 ...