理解Loadrunner中的Browser Emulation Simulate

案例

测试环境描述:

客户端 5台 Windows2000机器。服务器端  20台机器 一台F5(负载均衡设备,提供一个唯一的IP供客户端访问)

客户端绑定Host后,使用域名http://www.****.com来访问。
为了说明问题,简化的脚本说明如下。
     协议:http/html vuser_init:登陆;Action:查询某笔交易,查询成功的前提是用户必须登陆;vuser_end:退出  运行时设置参数Browser Emulation采用的是默认值。场景设置的是Goal-Oriented。
     在运行时发现,登陆都能成功,但是在执行Action时,部分成功,部分失败。为了查明失败的原因,在Vuser Generator中调试脚本,设置Action运行100次。每次运行时,总有一部分成功,一部分失败,而且是不规律的。这时候联想到服务器端有好多台 机器,是不是因为把查询交易的请求分发到不同服务器导致查询时因为没有登陆而失败呢。那么有什么办法让每一个Vuser访问固定的一台机器呢?这也符合实 际的业务情况,当一个用户登陆后,他所进行的一系列动作都是在同一台服务器上完成的,否则会不定时的让用户重新登陆。此时查看Browser Emulation,发现有一个设置“Simulate a new user on each iteration”。根据LR给出的解释是:在每一次迭代完成后,VuGen会把所有的http状态设置为vuser_init完成后的状态,然后以新 的用户进行下一次迭代。现实的情况是,如果每次Action迭代时,F5会根据当前服务器的使用情况把请求分发到空闲的机器上。这时就出现了上面所说的问 题。把此选项去掉后测试成功。

 http://blog.csdn.net/hhb200766/article/category/878123 性能分析

一:基本介绍

 

在Loadrunner的使用中,对于Run-time Settings下的browser emulation设置是比较容易让人产生困惑的地方。下面我们结合sniffer来具体看看每个选项的用途,以及对测试的影响。

clip_image002

                                               Browser Emulation 图

首先说一下,各个选项的含义:
Check for newer versions of stored pages every visit to the page选项
该设置将指示浏览器检查指定 URL 的较新(与存储在缓存中的 URL 相比)版本。启用该选项时,VuGen 将向 HTTP 标头中添加“If-modified-since”属性。此选项将打开页面的最新版本,但将在场景或会话执行期间生成更大的流量。默认情况下,浏览器不检查较新的资源,因此禁用该选项。配置该选项以匹配要模拟的浏览器中的设置。 
Download non-HTML resources选项
该选项指示 Vuser 在回放期间访问网页时加载图形图像。其中包括同页面一起录制的图形图像,还包括未明确同页面一起录制的图形图像。当实际用户访问网页时,需要等待图像加载。因此,如果尝试测试整个系统(包括终端用户时间),请启用该选项(默认情况下启用)。要提高性能并且不模拟实际用户,请禁用该选项。
注意:如果在图像检查中遇到了差异,请禁用该选项,因为每次访问网页时,一些图像会随之改变(例如,广告横幅)。
Simulate a new user on each iteration选项
指示 VuGen 将各个迭代之间的所有 HTTP 上下文重置为 init 部分结束时相应的状态。使用该设置,Vuser 可以更准确地模拟开始浏览会话的新用户。它将删除所有 Cookie,关闭所有 TCP 连接(包括 Keep-Alive 连接),清除模拟浏览器的缓存,重置 HTML 帧层次结构(帧编号将从 1 开始)并清除用户名和密码。默认情况下启用该选项。
Clear cache on each iteration选项
每次迭代时清除浏览器缓存,以模拟第一次访问网页的用户。清除该复选框可以禁用此选项并允许 Vuser 使用浏览器缓存中存储的信息,模拟近期访问过该网页的用户。

再来说说,我的想法:

性能测试是一门综合性的技术,它对测试人员要求很高,不仅仅需要了解性能测试工具的应用,而且还需要你了解操作系统、数据库、应用软件等多方面的知识。从这里我们也可以看到针对lr的不同参数的设置,而引起了测试数据的不同。lr的设置对应着IE的一些相关设置。这里就表现出了我们不仅仅要熟悉lr,还要深入了解lr和IE的对应关系。相信如果我们了解并应用好这些设置以后,我们在用户现场、产品入围等多种情况下,一定会取得您意想不到的惊喜!


我们可以看到不同的选项对服务器所产生的问题负载是不同的,负载主要产生在连接数和下载数据包的大小的不同。我们已经明确了解到了不同的选择对服务器可能导致的影响,那么我们怎样将它运用到实际的性能测试场景中去呢,我对此也经常感觉迷惑!从我这边来往往有几种组合策略来处理:
第一:最轻松的策略:下载所有的资源、去产生最大可能的连接数去和服务器交互。 
(我尝试过,我们心中总有这么一个概念:系统如果最大的负载都能承受下去了,那么现实过程中有着缓存的机制,那么这个性能肯定能过关说句实在话,如果这样做多了,良心会不安的!呵呵!开发知道了会对我们大声指责的!
第二:模拟。实际性能测试本身就是在模拟过程,模拟的过程越精确,那么我们的性能测试结果越准确。在性能测试中一共有三类模拟的过程,而这个我把它归在“操作行为的模拟”这一类上。我们在回头看LoadRunner的这几个设置选项,这些选项我把它分了两类的模拟设置:IE行为的模拟以及程序行为模拟。
IE行为的模拟(对应tacy里面介绍的ABCD):IE可以设置不同的策略来进行cache资源或者数据,那么我们回到实际用户操作中来,用户会按照什么策略来设置IE这些选项呢?聪明的用户肯定会利用浏览器的cache来加快运行速度,但是从我们实际调研过程中呢,感觉大多数用户基本上都会采用浏览器的本身的设置,不会做过得的变动。除非开发程序自动对这个进行限制或者提醒。所以这个选项我大多采用浏览器的默认设置或者程序操作说明书的要求去设定它!但是也会考虑新用户以及老用户的比例来做不同的设置策略.
程序行为的模拟:有些程序在javascript中设置把cache清除,要求每次操作必须重新建立连接,我们将采取这种策略去模拟它,所以这个行为的模拟我们往往会看程序设定的情况来设置
在这个设置中,我感觉LR有一个不太好的地方,如果我设置新用户(以及文件保留过期的用户)的操作以及老用户的设置这些选项时,我不得不把同样的脚本在controller放两个,然后设置不同的run time setting选项来模拟现实情况,这一点Webload好像就比它强一点!

 

二:案例和工具

1. 测试案例:

打开网站首页两次,对比不同Browser Emulation设置下loadrunner的行为,脚本如下。

Action()
{
    web_url("www.primeton.com", 
        "URL=http://www.primeton.com/", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=", 
        "Snapshot=t2.inf", 
        "Mode=HTML", 
        LAST);

    web_url("www.primeton.com", 
        "URL=http://www.primeton.com/", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=", 
        "Snapshot=t2.inf", 
        "Mode=HTML", 
        LAST);

    return 0;
}

 

2. sniffer工具

开源工具:Wireshark(前身是ethereal)(www.wireshark.org)

三:测试过程

为了方便描述,我们约定用:

A代表Simulate browser cache

B代表Cache URLs requiring content(HTMLs)

C代表Check for newer versions of stored pages every visit to the page

D代表Download non-HTML resources

E代表Simulate a new user on each iteratioin

F代表Clear cache on each iteration

首先设置Run Logic中的iteration为2。让Action运行两次,看看循环运行脚本两次,数据包和连接数的变化。

1. 去掉所有选项

结果:共获取数据包95个,建立连接1个(红色标识),断开连接1个(蓝色标识)

No.     Time        Source            Destination       Protocol Info
      1 0.000000    192.168.1.61      203.81.29.137     TCP      13835 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
      2 0.036053    203.81.29.137     192.168.1.61      TCP      http > 13835 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
     92 1.415887    192.168.1.61      203.81.29.137     TCP      13835 > http [FIN, ACK] Seq=817 Ack=71762 Win=257760 Len=0
     94 1.449960    203.81.29.137     192.168.1.61      TCP      http > 13835 [FIN, ACK] Seq=71762 Ack=818 Win=16464 Len=0

 

在这种情况下,数据包非常少(没有选择下载资源文件入css,js,gif等),而且你可以看到,打开4次首页,只建立了一个tcp连接。

这时,你即使选择A,发现数据包的数量量页没有变化,因为cache主要还是针对资源文件

2. 选择E(F)

结果:共获取数据包102个,建立连接2个(红色标识),断开连接2个(蓝色标识)

No.     Time        Source            Destination       Protocol Info
      1 0.000000    192.168.1.61      203.81.29.137     TCP      13886 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
      2 0.037013    203.81.29.137     192.168.1.61      TCP      http > 13886 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
     48 0.618117    192.168.1.61      203.81.29.137     TCP      13886 > http [FIN, ACK] Seq=409 Ack=35882 Win=257760 Len=0
     49 0.644106    192.168.1.61      203.81.29.137     TCP      13887 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
     51 0.651919    203.81.29.137     192.168.1.61      TCP      http > 13886 [FIN, ACK] Seq=35882 Ack=410 Win=16872 Len=0
     53 0.676377    203.81.29.137     192.168.1.61      TCP      http > 13887 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
     99 1.310379    192.168.1.61      203.81.29.137     TCP      13887 > http [FIN, ACK] Seq=409 Ack=35882 Win=257760 Len=0
101 1.347949    203.81.29.137     192.168.1.61      TCP      http > 13887 [FIN, ACK] Seq=35882 Ack=410 Win=16872 Len=0

在这种情况下,数据包非常少(没有选择下载资源文件入css,js,gif等),对比第一种情况,你会发现它建立了两个连接,这就是E的作用,它对于每次迭代都当成一个新的用户,需要重新建立连接。

3. 选择DE(F)

结果:共获取数据包1782个,建立连接6个(红色标识),断开连接6个(蓝色标识)

No.     Time        Source            Destination       Protocol Info
      1 0.000000    192.168.1.61      203.81.29.137     TCP      14016 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
      2 0.037911    203.81.29.137     192.168.1.61      TCP      http > 14016 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
      6 0.107432    192.168.1.61      203.81.29.137     TCP      14017 > http [SYN] Seq=0 Len=0 MSS=1460 WS=29 0.141816 203.81.29.137 192.168.1.61 TCP http > 14017 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0     426 3.334889    192.168.1.61      203.81.29.137     TCP      14017 > http [FIN, ACK] Seq=1852 Ack=150284 Win=257484 Len=0
    428 3.372253    203.81.29.137     192.168.1.61      TCP      http > 14017 [FIN, ACK] Seq=150284 Ack=1853 Win=16998 Len=0
    448 4.395488    192.168.1.61      203.81.29.137     TCP      14020 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
    457 4.439604    203.81.29.137     192.168.1.61      TCP      http > 14020 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
    859 7.593610    192.168.1.61      203.81.29.137     TCP      14016 > http [FIN, ACK] Seq=2849 Ack=377404 Win=257484 Len=0
    870 7.659680    203.81.29.137     192.168.1.61      TCP      http > 14016 [FIN, ACK] Seq=377404 Ack=2850 Win=15935 Len=0
    888 8.511308    192.168.1.61      203.81.29.137     TCP      14020 > http [FIN, ACK] Seq=1602 Ack=208150 Win=257760 Len=0
    890 8.549451    203.81.29.137     192.168.1.61      TCP      http > 14020 [FIN, ACK] Seq=208150 Ack=1603 Win=17280 Len=0
    892 8.566246    192.168.1.61      203.81.29.137     TCP      14022 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
    893 8.601893    203.81.29.137     192.168.1.61      TCP      http > 14022 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
    899 8.702628    192.168.1.61      203.81.29.137     TCP      14023 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
    904 8.741807    203.81.29.137     192.168.1.61      TCP      http > 14023 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
   1298 11.809456   192.168.1.61      203.81.29.137     TCP      14022 > http [FIN, ACK] Seq=1550 Ack=159770 Win=257484 Len=0
   1310 11.878665   203.81.29.137     192.168.1.61      TCP      http > 14022 [FIN, ACK] Seq=159770 Ack=1551 Win=17280 Len=0
   1341 12.771707   192.168.1.61      203.81.29.137     TCP      14026 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
   1348 12.813950   203.81.29.137     192.168.1.61      TCP      http > 14026 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
   1759 16.032952   192.168.1.61      203.81.29.137     TCP      14023 > http [FIN, ACK] Seq=3151 Ack=367918 Win=257484 Len=0
   1761 16.068296   203.81.29.137     192.168.1.61      TCP      http > 14023 [FIN, ACK] Seq=367918 Ack=3152 Win=17280 Len=0
   1779 16.983042   192.168.1.61      203.81.29.137     TCP      14026 > http [FIN, ACK] Seq=1602 Ack=208150 Win=257760 Len=0
   1781 17.016836   203.81.29.137     192.168.1.61      TCP      http > 14026 [FIN, ACK] Seq=208150 Ack=1603 Win=17280 Len=0

 

在这种情况下,数据包的数量非常大,连接也很多,由于没有cache功能,每次打开页面都需要重新下载所有的资源文件。

4. 选择ADE

结果:共获取数据包525个,建立连接3个,断开连接3个(不再标识了,syn即为连接请求,fin即为断开请求)

 

No.     Time        Source            Destination       Protocol Info
      1 0.000000    192.168.1.61      203.81.29.137     TCP      14189 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
      2 0.033657    203.81.29.137     192.168.1.61      TCP      http > 14189 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
      6 0.100636    192.168.1.61      203.81.29.137     TCP      14190 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
      9 0.133703    203.81.29.137     192.168.1.61      TCP      http > 14190 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
    429 3.383748    192.168.1.61      203.81.29.137     TCP      14190 > http [FIN, ACK] Seq=1852 Ack=150284 Win=257484 Len=0
    431 3.418556    203.81.29.137     192.168.1.61      TCP      http > 14190 [FIN, ACK] Seq=150284 Ack=1853 Win=16998 Len=0
    471 4.352071    192.168.1.61      203.81.29.137     TCP      14189 > http [FIN, ACK] Seq=1504 Ack=235576 Win=257760 Len=0
    472 4.380312    192.168.1.61      203.81.29.137     TCP      14192 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
    474 4.389778    203.81.29.137     192.168.1.61      TCP      http > 14189 [FIN, ACK] Seq=235576 Ack=1505 Win=17280 Len=0
    476 4.413220    203.81.29.137     192.168.1.61      TCP      http > 14192 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
    522 5.078068    192.168.1.61      203.81.29.137     TCP      14192 > http [FIN, ACK] Seq=409 Ack=35882 Win=257760 Len=0
524 5.115099    203.81.29.137     192.168.1.61      TCP      http > 14192 [FIN, ACK] Seq=35882 Ack=410 Win=16872 Len=0

在这种情况下,cache发挥作用,数据包对比第三种情况大大减少,几乎等于打开一次首页的数据量(449个数据包),只有第一次打开页面需要完整下载页面(包括资源文件),后面的三次打开页面都只要下载HTML页面(不包括资源文件)。

 

5. 选择ADEF

选择F之后我们看看结果:共获取数据包942个,建立连接4个,断开连接4个

No.     Time        Source            Destination       Protocol Info
      1 0.000000    192.168.1.61      203.81.29.137     TCP      14292 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
      2 0.034524    203.81.29.137     192.168.1.61      TCP      http > 14292 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
      6 0.102314    192.168.1.61      203.81.29.137     TCP      14294 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
      9 0.139752    203.81.29.137     192.168.1.61      TCP      http > 14294 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
    426 3.791111    192.168.1.61      203.81.29.137     TCP      14294 > http [FIN, ACK] Seq=1852 Ack=150284 Win=257484 Len=0
    428 3.824970    203.81.29.137     192.168.1.61      TCP      http > 14294 [FIN, ACK] Seq=150284 Ack=1853 Win=16998 Len=0
    468 6.213276    192.168.1.61      203.81.29.137     TCP      14292 > http [FIN, ACK] Seq=1504 Ack=235576 Win=257760 Len=0
    469 6.244052    192.168.1.61      203.81.29.137     TCP      14297 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
    471 6.249564    203.81.29.137     192.168.1.61      TCP      http > 14292 [FIN, ACK] Seq=235576 Ack=1505 Win=17280 Len=0
    473 6.279647    203.81.29.137     192.168.1.61      TCP      http > 14297 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
    479 6.374967    192.168.1.61      203.81.29.137     TCP      14298 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2
    484 6.419597    203.81.29.137     192.168.1.61      TCP      http > 14298 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0
    897 9.858493    192.168.1.61      203.81.29.137     TCP      14297 > http [FIN, ACK] Seq=1550 Ack=159770 Win=257484 Len=0
    899 9.895188    203.81.29.137     192.168.1.61      TCP      http > 14297 [FIN, ACK] Seq=159770 Ack=1551 Win=17280 Len=0
    939 12.840029   192.168.1.61      203.81.29.137     TCP      14298 > http [FIN, ACK] Seq=1806 Ack=226090 Win=257760 Len=0
    941 12.876120   203.81.29.137     192.168.1.61      TCP      http > 14298 [FIN, ACK] Seq=226090 Ack=1807 Win=17076 Len=0

在这种情况下,由于选择了F,在迭代的时候清除了cache,所以每次迭代都需要重新下载资源文件。数据包差不多等于第三种情况的一半,约等于打开两次首页的数据量(449×2个数据包)。

6. 关于BC选项

C的解释(Check for newer versions of stored pages every visit to the page)

C比较容易理解,类似IE设置中的每次检查,如果不设置C,LR对于已经cache的文件就不会重新向服务器请求,如果选择C,你就可以在数据包中发现很多304信息。

B的解释(Cache URLs requiring content(HTMLs))

LR对于资源文件的cache并不会真正cache在内存中或者在磁盘上,这个选项表示:对于一些需要用到的关联,校验,页面解析内容真正cache在内存中,减少客户端的重复工作。

当然如果你想把GIF也cache到内存中,你可以在Advanced中设置,选择Specify URL requiring content in addition to HTML pages,加入条目image/gif,并勾选。当Vuser运行的时候,你可以对比一下mmdrv.exe进程的内存消耗(内存占用会更多)。

四: 结论

通过上面的测试分析,我们大概知道了每个选项的真正含义,你需要根据你的测试目的来选择合适的设置:

1、 对于一个具体的应用测试,对于前端Web Server不可忽略,缺省设置非常合适,不需要调整(有时候需要考虑把C选上)

注意:很多人在录制脚本的时候,习惯把登入操作放到vuser_init中,这时候缺省设置可能会抛错,建议把这类的操作都放入到action中

2、 如果你更关注后端应用服务器的性能或者说做一些架构的验证分析,那你缺省设置对于你来说就不合适了,你需要选择取消所有的设置项。

当然你也可以根据自己的具体情况做不同调整,但是一定要真正理解这些选项的具体含义才能做到不犯错误

 

loadrunner运行时设置中清空缓存方法

具体操作方法:

用函数web_cache_clearup()
或run-time settings---browser emulation 把clear cache on each iteration打勾

  

在run-time  setting  中设置simulate  browser  cache  选项
Browser
Browser  Emulation:
Simulate  browser  cache:配置Vuser模拟带缓存的浏览器。缺省缓存是被允许的,
可以通过禁止该选项来使得所有VUser模拟的浏览器都不带缓存。

Cache  URLs  requiring  content(HTMLs):设置浏览器缓存URL的上下文(比如,HTML语法,认证或校验等),
其他的URL的上下文不会被缓存,以减少内存使用。可以通过点击Advance来定义需要上下文的URLs。

Check  for  newer  versions  of  stored  pages  every  visit  to  the  page:通过在header中添加
If-Modified-Sinces属性来设置浏览器检查比当前存储在缓存中特定URL更新的资源。缺省情况下,
浏览器不会自动检测更新的资源。

Download  non-HTML  resources:设置Vusers在刷新网页时下载图片。当真实用户访问网页时,
需要等待图片的加载完成。如果用户想要测试整个系统,包括终端用户时间,则需要勾上该选项。
如果需要提高性能且不需要模拟真实的用户,则不要选该项。

Simulate  a  new  user  on  each  iteraton:设置VuGen在每个循环的init会话结束,重启全部HTTP上下文。
这样使得Vuse更加真实的模拟一个新user开始一个浏览会话。该选项缺省是被选中的。

Clear  cache  on  each  iteration:当每个循环模拟一个最新访问站点的user时,
则要选中该选项。当每一个循环模拟一个最近访问过站点的user,浏览器仍为该用户保留网页
(从前面的循环中使用缓存页面)的情况则不要选中该选项。

posted on 2015-07-29 15:17  blogsheng  阅读(748)  评论(0编辑  收藏  举报