打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
loadrunner 脚本优化

 脚本优化-事务时间简介

by:授客QQ1033553122

事务概念

事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容(脚本section)。定义事务来衡量服务器的性能,例如,你可以定义一个事务来衡量服务器处理查看账户余额和显示信息于ATM的请求时间。

 

事务时间

一个事务的时间是指持续时间,从开始到结束。对于一个事务时间来说,一般由4个部分组成:

响应时间

Wasted Time

Think Time

事务自身时间

 

a) 响应时间

这个是事务的目的,响应时间是通过记录用户请求的开始时间和服务器返回内容到用户的时间差值来计算用户操作响应时间的。



注:这里不包含客户端GUI时间,例如浏览器解释页面所耗费的时间

 

对软件来说,通过事务得到的系统响应时间也是由非常多的部分组成的,一般来说,响应时间由网络时间、服务器处理时间、网络延迟三大部分组成。先来看看当一个客户端发出请求到服务器返回需要经历那些路径



1.网络时间

客户端发出请求后首先通过网络来到WebServer(消耗时间为N1)

然后WebServer将处理后的请求发给AppServer(消耗时间为N2)

App Server将操作数据指令发送给Database(消耗时间为N3)

 

Database服务器将查询结果数据发送回AppServer(消耗时间为N4)

App Server将处理后的页面发给WebServer(消耗时间为N5)

最后WebServerHTML转发到客户端(消耗时间为N6)

 

2.服务器处理时间

各个服务器处理所需要的时间WTATDT

 

3.网络延迟

最终响应时间=网络延迟时间+WT+AT+DT+(N1+N2+N3)+(N4+N5+N6)+WT+AT+DT

 

影响网络的因素一般包括以下内容:

1.前端Network

*DNSLookup

*Timeto connect

*Timeto first buffer

*NetworkTime

*DownloadTime

*SSLhandshake

*FTPauthentication

*ClientTime

*网络延迟

 

2后端服务

*WebServer

--ServletTime

--MethodTime

 

--静、动态压缩

*AppServer

--EJBTime

--MethodTime

--JNIDLookup

 

*DatabaseServer

--JDBCTime

--ConnectTime

--ExecuteTime

 

注意:通过事务可以获得每个操作所消耗的准确时间,例如查询、登录、删除操作。但是对于性能分析来说,这个时间还是太长了,无法有效解帮助我们定位性能瓶颈!lr目前也只能对自己发出的请求和服务返回的内容进行网络级别的分析,也就是说lr能够分析的时间为客户端到wwwweb服务器的时间N1web服务器返回到客户端的时间N6。这个时间和网络速度有关,可以用lr的专用词WebPage Breakdown来解释。也就是说VuGen以分析的时间至有客户端到WebServer之间的部分,后面从WebServerAppServer,再到DatabaseServer的时间只能得到一个总和。

 

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) 思考时间

ThinkTimeLoadRunner提供的一种模拟用户等待的方式,通过lr_think_time()函数实现。在函数内写入对应的时间(单位是秒),当脚本在Controller中运行到该函数时就会等待相应的时间。注意在VuGen中,回放ThinkTime默认关闭。

 

ThinkTime在进行性能测试时需要打开,只有这样每个虚拟用户才真正按照用户的操作速度来完成请求,才能得到真实情况下的系统数据。如果不打开ThinkTime,测试获得的数据是在全负载下的一些理论峰值数据。

那么ThinkTime在事务中如何影响事务时间呢?

lr_start_transaction(“thinktime”);

lr_think_time(5);

lr_end_transaction(“thinktime”,LR_AUTO);

 

Run-timeSettings中设置ThinkTime,启用ReplayThink 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).

所以ThinkTime会被算在事务的时间内,不过在Analysis中可以设置过滤规则将其扣除,另外我们建议尽量不要在事务内使用lr_think_time()函数。


d) 浪费时间(WastedTime)

在使用事务的时候,经常会看到在事务日志中有WastedTimeWastedTime是指事务中应该扣除的由于其他原因导致的时间浪费。如下:

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会将自身脚本运行浪费的时间自动记录WastedTime,例如执行关联,检查点等函数的时间

 

除了脚本自身浪费的时间,某些时候使用C语言等外部接口进行处理所消耗的时间也会影响事务的时间,这个时间LoadRunner无法处理。这种情况lr无法处理,需要人为地计算第三方时间开销,并且将这个开销的时间记入WastedTime,例如:

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 ascript=%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()函数将多余的时间开销扣除。

 

注意:在计算WastedTime时不要直接使用lr_wasted_time()覆盖,而忘了加上脚本中LoadRunner函数的自身时间。通过lr_get_transaction_wasted_time()函数可获得事务自身的WastedTime,将这个时间累加上第三方统计的WastedTime,再通过lr_wasted_time()函数覆盖。

阅读下篇:

Loadrunner 脚本优化-事务函数简介

 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
3.9 事务 - AJava
使用Loadrunner 调用Webservice接口测试优化总结 | 大爱
LoadRunner常用函数
LoadRunner学习笔记 - charmer - 51Testing软件测试网 - P...
LoadRunner脚本编写之三(事务函数)
loadrunner对事务状态的跟踪
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服