三、Controller
3.1 LoadRunner Controller 简介
当虚拟用户脚本开发完成后,使用Controller将这个执行脚本的用户从单用户转化为多用户,从而模拟大量用户操作,进而形成负载。(多用户单循环,多用户多循环)我们需要对负载模拟的方式和特征进行配置从而形成场景。
1、场景(Scenario)
是一种用来模拟大量用户操作的技术手段,通过配置和执行场景向服务器产生负载验证各系统各项性能指标是否达到用户要求,而Controller可以帮助我们对场景的设计执行及监控进行管理。
使用Controller管理场景主要分为:场景设计、场景监控。最后通过运行场景完成性能测试的执行。
3.2 手工场景(Manual Scenario)
1、定义
自行设置虚拟用户的变化,通过设计用户的添加和减少的过程,来模拟真实的用户请求模型,完成负载的生成。手工场景是‘定量型’性能测试,掌握负载的变化过程中系统各个组件的变化情况,定位性能瓶颈并了解系统的处理能力,一般在负载测试和压力测试中应用。手册场景的核心就是设置‘用户负载方式’。
2、手工场景——计划方式
- scenario:多个脚本之间按照设定的场景计划来统一运行。
- group:多个脚本之间按照独立设置模式跑,各个脚本可以单独设置虚拟用户、运行时间等。
3、手工场景——运行模式
- Real-world schedule(实际计划):可以通过Add Action来添加多个用户变化过程,包括多次负载增加用户,持续时间,停止用户。
- basic schedule(基本计划):经典模式,只能设置一个负载运行的虚拟用户配置,不能添加多个用户变化过程。
3.3 目标场景(Goal-Oriented Scenario)
1、定义
设置一个运行目标,通过Controller的自动加载功能进行自动化负载,如果测试的结果达到目标 ,说明系统的性能符合测试目标,否则就是提示无法达到目标。
2、五种目标类型
- Virtual Users:表示虚拟用户数,验证被测系统所需要支持的用户数。
- Hits per Second:表示每秒点击数,指一秒钟能做到的点击请求数目,即客户端产生的每秒请求数(正常情况下=服务器请求响应数)
- Transctions per Second:表示每秒事务数,一个事务代表一个操作,反映系统的处理能力。
- Transctions Response Time:表示事务的响应时间,反映系统的处理速度以及一个操作花费的时间。
- Pages per Minute:表示每分钟页面的刷新次数,反映系统每分钟提供的页面处理能力,代表了系统的整体处理能力。
3.3 负载生成器(Load Generators)
对场景进行设计后,需要对负载生成器进行管理和配置。Load Generators是运行脚本的负载引擎,(相当于加压机)主要功能是生成虚拟用户进行负载,在默认情况下使用本地的负载生成器来运行脚本。
但是每生成一个虚拟用户,需要花费负载生成器大约2M-3M的内存空间。通常运行Controller的主机很少用作负载生成器。负载生成器的工作多由其他装有LR Agent的PC机来担任。如果负载生成器内存的使用率大于了70%,负载生成器就会变成系统的瓶颈,导致性能测试成绩下降。这种问题需要添加负载生成器来解决。所以在一台电脑上无法模拟大量的虚拟用户,这个时候需要调用多个Load Generators来完成大规模的性能负载。
3.4 运行时设置详细说明(Run-TimeSetting)
一、General
1、Run Logic运行逻辑
设置脚本的运行,以及action的运行顺序
- Number of Iterations:只为Run上设置迭代次数(运行的次数),不为Init,End设置。
- Insert Action:插入Action,是脚本清晰明了。
- Insert Block:提供了一个脚本块的功能,方便我们对脚本进行层次组合。
- Delete:删除
- Move Up:向上移动
- Move Down:向下移动
- Properties:属性
两种运行模式
- Sequential:在Run下的所有脚本将按照从上到下的先后顺序运行
- Random:在Run下所有脚本根据各自设置的比例进行随机选择运行(Run上多了一个%)
2、Pacing步调
配置脚本运行中每次iteration之间的等待时间,需要在重复做某件事之前插入一个等待时间,就可以通过这个功能来实现。每当出现一次starting iteration或者是ending iteration就会检查一次pacing的设置。
- As soon as the previous iteration end:默认设置前一次iteration和后一次iteration之间无等待时间。
- After the previous iteration ends:在前一次的iteration的结束时间设置,包括fixed(固定多少时间)和random(随机等某个范围内的时间)
- With a fixed/random delay of sec:设置前一次ending iteration到下一次starting iteration之间的时间。
- At fixed/random interation和下一次starting iteration之间的时间,所以At是包含前一次iteration执行的时间。
3、Log 日志
- Send message only when an arror occurs:只有当发生错误是才发生日志信息
- Standard log:标准日志
- Extended log:扩展日志
- Parameter substitution:显示参数的赋值取值
- Data returned by server:显示服务器返回的数据
- Advanced trace:高级的追踪
4、Think Time 思考时间
设置模拟用户等待操作的时间,由于LoadRunner回放脚本时全速进行的,而真正的用户的操作并不会如此迅速,所以要通过添加等待时间的方式,在脚本的运行过程中模拟用户的等待操作,实现这个操作的函数是:lr_think_time();
- Ignore think time:忽略思考时间
- Replay think time:回放思考时间
- As recorded:当录制的时候
- Multiply recorded think time by xx:xx秒乘以录制的思考时间
- Use random percentage of recorded think time:使用随机的百分比录制思考时间
- Limit think time to xx seconds:限制思考时间为xx秒
5、Additional attributes 增加的属性
- Argument name:参数名
- Argument value:参数值
6、Miscellaneous其他各种设置
-
Error Handing错误处理
脚本中某个函数出错会导致整个脚本的停止运行,但在场景中会继续运行
- Continue on error:出现错误了继续运行
- Fail open transaction on lr_error_message:失败了就在lr_error_message函数中打开事务
- Generate snapshot on error:错误出现时生成快照
-
Multithreading进程与线程
进程是指一个虚拟用户用一个mmdrv.exe,线程是指多个用户一起使用一个mmdrv.exe
- Run Vuser as a process:以一个进程运行虚拟用户
- Run Vuser as a thread:以一个线程运行虚拟用户
-
Automatic Transactions自动化事务
事务是用来获得某一行为所消耗时间的函数,默认情况下我们自己定义事务
- Define each action as a transaction:定义每一个action作为事务
- Define each step as a transaction:定义每一步作为一个事务
二、Network
7、Speed Simulation宽带模拟
提供了宽带模拟的选项,默认情况下,脚本是以最大宽带的情况来进行访问的
- Use maximum bandwidth:使用最大的宽带
- Use bandwidth:使用规定的宽带
- Use custom bandwidth[bps]:使用自定义的宽带
三、Browser浏览器
8、Browser Emulation浏览器模拟
这个功能模拟了整个http头中user-agent信息,从而让服务器错误的认为是一个个真实的客户端对服务器发出了请求,通过设置可以将脚本模拟成各种浏览器,用来做浏览器兼容性测试。
- User-Agent(browser to be emulated):使用虚拟用户(浏览器被模仿)
- Simulate browser cache:模仿浏览器的cache
- Cache URLs requiring content(HTMLs):cache URLs 中需要的内容
- Check for newer versions of stored pages every visit to the page:检查比存储的页面更新的每个访问的页面
- Download non-HTML resources:下载non-html资源
- Simulate a new user on each iteration:在每次迭代模拟一个新用户
- Clear cache on each iteration:在每次迭代的时候清除cache
四、Internet Protocol网络协议
9、Proxy代理
- No Proxy(direct connection to the Internet):没有代理(直接连入国际互联网)
- Obtain the Proxy setting from the default browser:从默认浏览器获得代理设置
- Use custom Proxy:使用自定义代理
- Use automatic configuration script:使用自动配置脚本
- Use Proxy server:使用代理服务器
10、Preferences优先设置
- Checks检查
- Enable image and text check:打开图片和文本检查,一般情况下关闭该选项
- Generate web performance graphs:设置回放时是否监控页面性能计数
- Hits per second and http codes:每秒点击次数,HTTP的代码
- Pages per second(html mode only):每秒页面响应数(只有网页模式)
- Response bytes per second:每秒响应的字节数
- Advanced高级的
- WinInet replay instead of sockets(windows only):使用wininet的引擎回放脚本(只有windows使用),默认使用socket端口进行回放
- File and line in automatic transaction names:文件和行自动添加一个唯一的事务名
- Non-critical resource error as warnings:资源文件如果出错,我们不以warnings提醒的方式出现,而直接出现error
- Save snapshot resources locally:在本地保存抓图的资源
- Set advanced options:设置高级选项,提供了对HTTP请求的所有设置选项
11、Download Filters下载过滤器
- Include only addresses in list:只包含清单里的地址
- Exclude addresses in list:排除列表中的地址
3.5 Windows系统资源监控
1、步骤(运行后)
打开Controller,点击左下角的Run,右击Windows Resources - Last 60 sec视图,点击Add Measurements…,然后添加被测试的服务器,最后进行添加参数指标
2、Windows系统资源性能常用计数器
一、System(系统)
1.%Total Processor Time(总处理器时间)
该计数值用于体现服务器整体的处理利用率,对多处理器系统而言,该计数值体现的是所有CPU的平均利用率。如果该值得数值持续超过90%,则可以说明整个系统面临处理器方面的瓶颈,需要通过增加处理器来提高性能。
2.File Data Operations/sec(文件数据操作/秒)
计算机对文件系统进行读取和写入操作的频率,但是不包括文件控制操作。
3.Process Queue Length(队列长度)
线程在等待分配CPU资源所排队列的长度,此长度不包括正在占有CPU资源的线程。如果该队列的长度大于处理器个数+1,就表示处理器有可能处于阻塞状态(参考值:<=处理器个数+1)
二、Process(进程)
1.%Process Time
CPU利用率,该计数器最为常用,可以查看处理器是否处于饱和状态,如果该值持续超过95%,就表会视当前系统的瓶颈为CPU,可以考虑增加一个处理器或更换一个更好的处理器。(参考值:<80%)
2.%Privileged Time
CPU在特权模式下处理线程所花的时间百分比。一般的系统服务,进程管理,内存管理等一些由OS(操作系统Operating System)自行启动的进程属于这类。
3.%User Time
与%Privileged Time 计数器正好相反,指的是在用户状态模式下(即非特权模式)的操作所花的时间百分比。
4.DPC Time
处理器在网络处理上消耗的时间,该值越低越好。
*DPC:数据处理中心(Data Processing Center)
5.Private Bytes(专用字节)
进程无法与其他进程共享的字节数量,该计数器的值较大时,有可能是内存泄漏的信号。
6.Work set(工作集)
最近处理线程使用的内存页。
三、Memory(内存)
1.Page Faults/sec
表示每秒钟处理的错误页数;当处理器在内存中读取某一页出现错误时,就会产生缺页中断,也就是page Fault。如果这个页位于内存的其他位置,这种错误称为软错误,如果这个页位位于硬盘上,必须从硬盘重新读取,这个错误称为硬错误。硬错误会使系统的运行效率很快降下来。
2.Page Input/sec
表示为了解决硬错误而写入硬盘的页数(参考值:>=Page Reads/sec)
3.Page Reads/sec
表示为了解决硬错误而从硬盘上读取的页数。
4.Pages/sec
表示为了解决硬错误而从硬盘上读取或写入硬盘的页数(参考值:0~20)
5.Available Mbytes
剩余的可用物理内存,单位是兆字节(参考值:>=10%)
6.Cathe Bytes
文件系统的缓存(默认为50%的可用物理内存)
四、Physical Disk
1.%Disk Time
表示磁盘驱动器为读取或写入请求提供服务所用的时间百分比,如果只有%Disk Time比较大,硬盘有可能是瓶颈。
2.Average Disk Queue Length
表示磁盘读取和写入请求提供服务所有的时间百分比,可以通过增加磁盘构造磁盘阵列来提高性能(<=磁盘数的2倍)
3.Average Disk write Queue Length
表示磁盘写入请求的平均数
4.Average Disk sec/Read
磁盘中读取数据的平均时间,单位是s
5.Average Disk sec/Transer
磁盘中写入数据的平均时间,单位是s
五、Network Interface
1.Byte Total/sec
表示网络中接受和发送字节的速度,可以用该计数器来判断网络是否存在瓶颈(参考值:该计数器和网络带宽相除,<50%)
3.6 集合点
1、集合点的含义
当通过controller虚拟多个用户执行脚本时。用户的启动或运行步骤不一定都是同步的。集合点是在脚本的某处设置一个标记。当有虚拟用户运行到这个标记处时,停下等待,直到所有的用户都到达这个标记处时,再一同进行下面的步骤,这样能够用最大的用户并发去做下面的操作,就像集合后再前进一样。集合点主要用于对关键步骤的加压。
2、插入集合点的目的
集合点用处对于LoadRunner来说意义非常大,它可以设置多个虚拟用户等待到一个点同时触发一个事务,以达到模拟真实环境下同时多个用户操作,同时模拟负载,实现性能测试的最终目的。插入集合点主要是为了衡量在加重负载的情况下服务器的性能情况,从而找到性能瓶颈。可以把集合点理解成是一种特殊情况下的并发。
3、集合点的设置
在Virtual User Generator中,使用函数lr_rendezvous();来设置集合点,在Controller中,通过工具栏中的Scenario点击Rendezvous来设置集合点
3.7 IP欺骗
1、概念
IP地址欺骗是指用户产生的IP数据包为伪造的源IP地址,以便冒充其他系统或发件人的身份。是一种黑客的攻击形式,黑客使用一台计算机上网,而借用另外一台机器的IP地址,从而冒充另外一台机器于服务器打交道。
2、为什么要用IP欺骗
1、当某个IP的访问过于频繁,或者访问量过大时,服务器会拒绝访问请求,这时或通过IP欺骗可以增加访问频率和访问量,以达到压力测试的效果。
2、某些服务器配置了负载均衡,使用同一个IP不能测出系统实际的性能。LoadRunner中的IP欺骗通过调用不同的IP,可很大程度上的模拟实际使用中多IP访问和并测试服务器均衡处理的能力。
3、有一些网站会限制用一个用户同一个IP的登录。为了更加真实的模拟实际情况,LoadRunner允许运行的虚拟用户使用不同的IP访问用一个网站。
如下提示为:Ip欺骗表示要设置静态IP
3、设置静态IP
1、控制面板\网络和 Internet\网络和共享中心,点击所连接的网络,设置属性,找到IPv4,进行设置,手动输入IP地址,在命令窗口,输入ipconfig /all,找到相应的ip进行填写即可。
2、在HP Software中找到并打开IP Wizard
3、然后直接下一步,到这个界面,可以进行添加IP地址,点击add,选择C类网址,
4、对于生成的IP地址可以进行保存,以便以后进行导入
4、A、B、C类IP地址的区别
1、A类IP地址
一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”,地址范围从1.0.0.0到126.0.0.0.可用的A类网络有126个,每个网络能容纳1亿多个主机。
2、B类IP地址
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255.可用的B类网络有16382个,每个网络容纳6万多个主机。
3、C类IP地址
一个C类地址是由3字节的网络地址和1字节的主机地址组成,网路地址的最高位必须是“110”。范围从192.0.0.0-233.255.255.255C类网络达209万余个,每个网络能容纳254个主机。
5、IP欺骗功能上应该注意事项:
1、虚拟IP是同一个Generator上党的多个IP,这种分配过程由Controller自动来进行。
2、对于同一个Generator,你模拟的用户数量多于IP数量时,将会发生IP重复的现象,否则将随机分配不同的IP。
3、对于同一个Generator,以其某一个IP添加到Generator中即可,不需要用不同的IP添加多次。
4、IP欺骗设置前主机IP为固定的IP,测试完成之后要释放掉IP。
6、相关设置(Virtual User Generator)
1、修改URL中的IP地址为本机IP
2、最少添加一个事务
3、设置日志及线程
Replay–>Runtime Settings–>Log中勾选扩展日志(Extended log)(三个都勾上)
Replay–>Runtime Settings–>Miscellaneous中选择Thread运行模式
7、相关设置(Controller)
1、启用IP欺骗
Scenario–>Enable Spoofer
2、启用专家模式(开发调试模式)
Tools–>Expert Mode
3、修改General为线程模式
Tools–>Options–>General–>IP address allocation per thread
3.7 Service-Level Agreement(服务水平协议)
SLA是为负载测试场景定义的具体目标。例如,评测脚本中任意数量事务的平均响应时间,可以定义具体的目标或阈值。测试运行结束之后,LoadRunner将你定义的目标与实际录制的平均事务响应时间进行比较。如果实际的平均事务响应时间未超过你定义的阈值,SLA状态将为通过,否则不通过。
作为目标定义的一部分,可以指示SLA将负载条件考虑在内。这意味着可以接受的阈值将根据负载级别而有所更改(例如,运行的Vuser数,吞吐量等)。。随着负载的增加,你可以允许更大的阈值。
SLA与面向目标场景的主要区别是前者有一定的调整幅度,而面向目标场景是很具体的目标设定。
设置步骤:
1、在Service Level Agreement中点击New,来创建一个新的服务水平协议
2、选择测量值
3、选择事务
在这里插入图片描述
4、添加负载条件
5、设置完成
3.8 LR常用函数
一、事务函数
- Lr_start_transaction();//标记事务的开始
- Lr_end_transaction();//标记事务的结束,事务开始与事务结束联合使用
- Lr_get_trans_instance_status();//得到事务的状态,当事务由许多步骤组成,或者可能存在导致事务失败的执行点,可以通过检查状态和终止Vuser,可以避免不必要的活动。
- Lr_get_transaction_think_time();//得到事务的指定思考时间
- Lr_stop_transaction();//停止事务,该函数返回当前事务的持续时间,以毫秒为单位,当为错误时,返回一个负数。
二、日志函数
- Lr_debug_message();//发送调试信息到日志文件,这个函数将返回设定的字符,不包括终止null字符。错误时它返回一个负值。
- Lr_error_message();//返回当前调试的信息,其返回值是根据不同日志设置返回不同的值。
- Lr_error_message();//发送信息到用户日志文件,如果这个函数成功,返回发送的消息的长度。如果函数失败,返回一个负值。
- Lr_output_message();//发送信息到输出窗口或日志文件。
- Lr_vuser_status_message();//发送虚拟用户的状态到LR的Controller,如果它成功,这个函数返回0。如果事务的名字是非法的或如果和Lr_start_transaction事务开始名称不同时,返回1。
三、运行时函数
- Lr_abort();//终止执行的脚本,它能停止执行action部分,vuser_end部分,以及结束脚本执行。当你需要手动终止运行的一个特定的错误条件可以使用这个函数。当你结束运行使用此函数时,状态是“停止”
- Lr_continue_on_error();//当发生错误后运行的事件,参数为1表示发生错误继续运行脚本,参数为0表示取消出错继续运行脚本。
- Lr_exit();//该函数允许你允许中退出脚本。在声明该函数的食物退出后不会出现在controller的事务状态集合中,也不会被计入到通过和失败的事务数。
- Lr_think_time();//设置思考时间,在性能测试中为了更好模拟以后操作,可以根据实际产生环境设置思考时间。
- Lr_rendezous();//集合点,可以设置虚拟用户相同操作之前进行集合,通过集合可以增加被测试应用的压力,从而达到压力测试的目的。
- Lr_load_dll();//调用DLL文件,这个函数执行成功,将返回0如果导致内存溢出条件返回10,如果文件不存在,返回11。
3.9 Controller 小结
一、创建场景
- 手工场景:自定义用户数的“定量型”的性能测试
- 目标场景:设定目标,使用Controller的自动加载功能进行自动化负载
二、负载生成器(加压机)
- 负载生成器功能
- 生成虚拟用户进行负载
- 负载生成器配置
三、进行场景
- 性能资源监视图
- 系统资源监控
四、集合点设置
lr_rendezous();
五、IP欺骗
- 静态IP设置(IP欺骗不支持DHCP动态分配的IP)
- IP欺骗设置(A,B,C类地址概念)
- IP欺骗验证
六、SLA服务水平协议
- SLA:为负载测试场景定义的具体目标
- SAL目标设置(阈值设定)
- SLA与目标场景的区别
七、常见LR函数
- 事务函数
- 日志函数
ue_on_error();//当发生错误后运行的事件,参数为1表示发生错误继续运行脚本,参数为0表示取消出错继续运行脚本。
- Lr_exit();//该函数允许你允许中退出脚本。在声明该函数的食物退出后不会出现在controller的事务状态集合中,也不会被计入到通过和失败的事务数。
- Lr_think_time();//设置思考时间,在性能测试中为了更好模拟以后操作,可以根据实际产生环境设置思考时间。
- Lr_rendezous();//集合点,可以设置虚拟用户相同操作之前进行集合,通过集合可以增加被测试应用的压力,从而达到压力测试的目的。
- Lr_load_dll();//调用DLL文件,这个函数执行成功,将返回0如果导致内存溢出条件返回10,如果文件不存在,返回11。