事务概念

事务是指用户在客户端做一种或多种业务所需要的操作集(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("%s", 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()函数覆盖。

Loadrunder之脚本篇——事务时间简介的更多相关文章

  1. loadrunner 脚本优化-事务时间简介

    脚本优化-事务时间简介 by:授客 QQ:1033553122 事务概念 事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容 ...

  2. loadrunder之脚本篇——脚本基础知识和常用操作

    1)编码工具设置 自动补全输入Tools->General Options->Environment->Auto complete word 显示功能语法Tools->Genr ...

  3. loadrunder之脚本篇——接口传参为本地文件

    导言 前几天需要对公司一个专门很重要的接口进行压测,这个还不是重点,重点是传参为本地的图片!刚刚开始通过web_custom_request()函数来解决,可是脚本并不能通过!后面又百度不到答案,通过 ...

  4. loadrunder之脚本篇——集合点设置

    1  作用 通过让多用户在同一时间点上进行并发操作来测试系统的并发处理的能力 2  实现 通过集合点函数来实现. 注意:集合点经常和事务结合起来使用.集合点只能插入到Action部分,vuser_in ...

  5. loadrunder之脚本篇——定义全局变量

    如果参数是全局的,在脚本中的任何一个Action中都可以使用,变量一般是局部的,如果跨Action调用会出现未声明的错误. 打开Script视图中左侧Action列表中的globals.h文件,可定义 ...

  6. loadrunder之脚本篇——int类型和字符串的相互转换

    字符串转化为int型变量 Action2() { int j = 0; j = atoi("12345");  //将字符串变为整形 lr_output_message(" ...

  7. loadrunder之脚本篇——Run-time Settings之Pacing

      As soon as the previous iteration ends 前一个迭代一结束就尽可能快的开始新一轮的迭代   After the previous iteration ends ...

  8. loadrunder之脚本篇——加密解密

    密码加密 可以给密码加密,意在把结果字符串作为脚本的参数或者参数值.例如,完整可能有一个用户密码填写的表单,你想测试网站针对不同密码的反应,但是你又想保护密码的安全.Password Encoder允 ...

  9. Loadrunder之脚本篇——关联函数对话框详解

    Insert->New Step,打开Add Step对话框 选择函数web_reg_save_param,点击OK,打开关联函数设置窗口 说明: Parameter Name 此处设置存放参数 ...

随机推荐

  1. 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)

    各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程 ...

  2. LINUX内核升级-更新网卡驱动

    因项目需要,将当前内核(2.6.32-220.el6.x86_64)升级到目标内核(2.6.33-110.el6.x86_64),但是编译的目标 内核(2.6.33-110.el6.x86_64)的对 ...

  3. IOS设计模式浅析之外观模式(Facade)

    引言 在项目开发中,有时候会遇到这样的一种情景:已有系统的各个子系统之间,随着业务需求的发展,有了比较紧凑的耦合关系.现在需要利用这些子系统的功能,为移动端提供业务处理.我们该怎么应对这样的业务需求呢 ...

  4. github桌面工具commit不了解决

    这样发现github上还是空文件,  因为要重新添加过 1.  git add -A  添加所有文件 2. git commit -m "xxx" 3.  git push -u ...

  5. OC 内存管理-01

    创建对象 .分配内存空间,存储对象 .初始化成员变量 .反回对象的指针地址 //过程 ()对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据, 当我们 ...

  6. [浪风转载]Jquery取得iframe中元素的几种方法

    iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作 DOM方法:父窗口操作IFRAME:window.frames["iframeSon ...

  7. Fibonacci series(斐波纳契数列)的几种常见实现方式

    费波那契数列的定义: 费波那契数列(意大利语:Successione di Fibonacci),又译费波拿契数.斐波那契数列.斐波那契数列.黄金切割数列. 在数学上,费波那契数列是以递归的方法来定义 ...

  8. poj 3686(拆点+最小权匹配)

    题目链接:http://poj.org/problem?id=3686 思路:显然工件为X集,机器为Y集合.由于每个机器一次只能加工一个部件,因此我们可以将一台机器拆成N个点,至于部件与机器之间连多大 ...

  9. iOS-获取的NSDate date时间与实际相差8个小时解决方案

    本文转载至 http://blog.sina.com.cn/s/blog_51a995b70101iptl.html NSDate *date = [NSDate date]; NSTimeZone  ...

  10. NPOI操作Excel常用函数

    最近因项目接触了NPOI,感觉还是蛮不错的,网络上的教程普遍版本较老,本篇记录所常用操作,采用NPOI 2.0版本. 推荐: NPOI官方网站 NPOI 1.2.4/1.2.5 官方教程 新建Exce ...