在LoadRunner中为什么要设置思考时间和pacing答:录制时记录的是客户端和服务端的交互,如果要精确模拟用户的行为,那么客户操作客户端时花费了很多时间要怎么模拟呢?录入填写提交的内容,从列表中下拉搜索选择特定的值等,这时LOADRUNNER不会记录用户的客户端操作,而是记录了用户这段时间,成为思考时间(Think-time),因为用户的这些客户端操作不会影响服务端,只是让服务器端在这段时间内没有请求而已。,所以加入思考时间就能模拟出熟练的或者生疏的用户操作,接近实际对于服务端的压力。Vuser思考时间模拟实际用户在不同操作之间等待的时间。例如,当用户收到来自服务器的数据时,可能要等待几秒钟查看数据,然后再做出响应。这种延迟就称为“思考时间”。VuGen使用lr_think_time函数将思考时间值录制到Vuser脚本中。以下录制的函数指明用户等待了8秒钟才执行下一个操作:lr_think_time(8);当您运行了Vuser脚本并且Vuser遇到了上述lr_think_time语句时,默认情况下,Vuser将等待8秒钟后再执行下一个操作。可以使用思考时间运行时设置来影响运行脚本时Vuser使用录制思考时间的方式。如何理解TPS?答:TPS主要还是体现服务器对当前录制的事务的处理速度快慢。TPS高并不代表性能好。TPS是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息来估计得分。客户机使用加权协函数平均方法来计算客户机的得分,试软件就是利用客户机的这些信息使用加权协函数平均方法来计算服务器端的整体TPS得分。如何使用loadrunner批量添加树型结构数据/*此段代码为:添加”树状”节点数据,代码源于*****项目,此码仅添加数据到第三层。*//*前置条件:用户已登录并具有操作权限*//*思路:新增一级节点–获取一级ID–添加二级节点–展开一级节点–获取二级ID–添加三级数据*//*说明:添加一级节点–逐个读取一级节点ID–读到一个一级节点就给它添加二级节点–二级节点添加完一次就读一次ID–读一次二级节点直接添加三级节点*//*修改”树状”节点数据的代码类似,Submit修改时,要多建一个参数TreeCode*/inti,j,k,p;//循环变量intNo1,No2,No3;//分别保存一、二、三级节点的个数intM1,M2,M3;//分别定义一、二级节点的数量,三级节点不保存数据,故未限制大小char*MyID1[90],*MyID2[90],m[40];//MyID1用于储存所有一级节点数据,m为临时数组变量/*MyID的长度也大于M的长度;m的长度要大于ID的长度+1*/M1=30;M2=20;M3=10;/*RootID名称需要按模块修改,Control里需要重新参数化*/lr_save_string(“FindRootIDinWebResource”,”RootID”);//根节点的ID,修改此处即可使用lr_output_message(“当前根节点的ID号为:%s”,lr_eval_string(“{RootID}”));for(i=1;i=M1;i++)//添加M1个一级节点{lr_save_int(i,L);//#########添加一级节点web_submit_data({RootID}{L});}lr_output_message(已添加%d个一级节点,M1);web_reg_save_param(IDS,//获取一级节点IDLB=value=\,RB=\,ORD=All,LAST);//#######展开根节点web_url({RootID});No1=atoi(lr_eval_string({IDS_count}));//获取ID的数量,保存在变更No1中lr_output_message(获取一级节点的数量为:%d,No1);if(No1M1){No1=M1;}//让No1=M1for(i=1;i=No1;i++)//将一级节点的ID写入MyID1中{sprintf(m,{IDS_%d},i);//生成动态字符串{IDS_i},存在变量m中************核心步骤MyID1[i-1]=lr_eval_string(m);//读取{IDS_i}参数对应的值,保存到MyID1中****核心步骤lr_output_message(一级节点第%d共%d,m=%s即MyID1[%d]=,%s,i,No1,m,i-1,MyID1[i-1]);lr_save_string(MyID1[i-1],SubID);//将MyID1转换为参数{SubID}以便使用for(j=1;j=M2;j++)//添加M2个二级节点{lr_save_int(j,M);//#######添加下级节点web_submit_data({RootID}{SubID}{M});}lr_output_message(已添加%d个二级节点,M2);web_reg_save_param(IDS2,//获取二级节点IDLB=value=\,RB=\,ORD=All,LAST);//########展开选中节点web_url({RootID}{SubID});No2=atoi(lr_eval_string({IDS2_count}));//获取ID的数量,保存在变更No2中lr_output_message(获取二级节点的数量为:%d,No2);if(No2M2){No2=M2;}//让No2=M2for(k=1;k=No2;k++)//将二级节点的ID写入MyID2中{sprintf(m,”{IDS2_%d}”,k);//生成动态字符串{IDS2_i},存在变量m中************核心步骤MyID2[k-1]=lr_eval_string(m);//读取{IDS2_i}参数对应的值,保存到MyID2中****核心步骤lr_output_message(“开始处理@二级节点:第%d共%d,m=%s即MyID1[%d]=,%s”,k,No2,m,k-1,MyID2[k-1]);lr_save_string(MyID2[k-1],”SubID2″);//将MyID1转换为参数{SubID}以便使用lr_save_int(k,”N”);for(p=1;p=M3;p++)//添加子节点{lr_save_int(p,”P”);//########添加三级节点web_submit_data(“{RootID}{SubID}{P}”);}lr_output_message(“当前状态@一级节点%d,二级节点%d:已添加%d个三级节点”,i,k,M3);}}loadrunner对应用程序性能分析的总结一个应用程序是由很多个组件组成的,整个应用程序的性能好不好需要从整体入手去分析。打开analysis页面,将左下角的displayonlygraphscontainingdata置为不选,然后选中webpagebreakdown,点击“opengraph”添加需要分析的功能项。webpagebreakdown中显示的是每个页面的下载时间。点选左下角webpagebreakdown展开,可以看到每个页中包括的css样式表,js脚本,jsp页面等所有的属性。在selectpagetobreakdown中选择页面。选中后,在选择栏下方看到属于它的组件。哪一行的事物占据的时间较长,那么它的消耗时间点就在这里,分析问题也就要从这里入手。对相应的组件所标注的颜色分析如下:1、dnsresolution显示使用最近的dns服务器,将dns解析为ip地址所需要的时间,“dns查找”度量是指示dns解析问题或dns服务器问题的一个很好的指示器。2、connection显示与包含指定的URL的web服务器建立初始连接所需要的时间。连接度量是一个很好的网络问题指示器。另外,他还能判断服务器是否对请求作出响应。3、firstbuffer显示从初始HTTP请求(通常为get)到成功收到来自web服务器的第一次缓冲时为止所经过的时间。第一次缓冲度量可以判断是否存在web服务器延迟或者网络滞后。注意点:由于缓冲区最大为8k,因此第一次缓冲时间可能也就是完成元素下载所需要的时间。4、sslhandshaking显示建立ssl连接(包括客户端请求,服务器请求,客户端公用密钥传输,服务器证书传输及其它部分可选阶段)所用的时间。自此点之后,客户端及服务器之间所有的通信都将被加密。注意点:ssl握手度量仅适用用https通信。5、receive显示从服务器收到最后一个字节,并完成下载之前所经过的时间。接收度量可以查看网络质量,查看用来计算接收速率的时间/大小比率。6、ftpauthentication显示验证客户端所用的时间。如果使用ftp,则服务器在开始处理客户端命令之前,必须验证该客户端。、此功能只是用与使用ftp通信。7、client显示因浏览器思考时间或其它与客户端有关的延迟而使客户机上的请求发生延迟时,所经过的平均时间。8、error显示从发出HTTP请求到返回错误消息(仅限于HTTP错误)期间所经过的平均时间。分析以上指标,结合系统资源监控指标,会比较准确快速的定位问题。从而对系统的性能及随后的调优提供针对性的意见。使用LoadRunner进行性能测试的一般步骤是什么?☆确定需要进行测试的业务或交易,通过手工操作和VuserGenerator的录制功能来记录并生成虚拟用户脚本。☆手工修改虚拟用户脚本,确定脚本能够成功回放。☆在Controller中对场景进行配置后,启动测试。在测试过程中,Controller控制LoadGenerator对被测系统的加压方式和行为。☆Controller同时负责搜集被测系统各个环节的性能数据。各个LoadedGenerator会记录最终用户响应时间和脚本执行的日志。☆压力运行结束后,LoadedGeneraror将数据传输到Controller中,有Controller对测试结果进行汇总。☆借助数据分析工具Analysis对性能测试数据进行分析,确定瓶颈和调优方法。☆对系统进行针对性的调优,重复进行压力测试,确定性能是否有所提高。loadrunner中的设置线程和进程的区别loadrunner中,在进行运行设置中有一项选择,是按进程运行Vuser或按线程运行Vuser?下面进行分别来讲:1.按进程运行Vuser:Controller将使用驱动程序mdrv运行Vuser。如果按进程方式运行每个Vuser,则对于每个Vuser实例,都将启动一个mdrv进程。如果设置了10个Vuser,则在任务管理器中出现10个mdrv进程。多个mdrv进程肯定会占用大量内存及其他系统资源,这就限制了可以在任一负载生成器上运行的Vuser的数量。2.按线程运行Vuser:及设置了10个Vuser,其只会调用一个驱动程序mdrv.而每个Vuser都按线程运行,这些线程Vuser将共享父进程的内存段。这就节省了大量内存控件,从而可以在一个负载生成器上运行更多的Vuser。任何选择都是有两面性的。选择线程方式运行Vuser会带来一些安全问题。因为线程的资源是从进程资源中分配出来的,因此同一个进程中的多个线程会有共享的内存空间,这样可能会引起多个线程的同步问题,调度不好,就会出问题,不如A线程要用的资源就必须等待B线程释放,而B也在等待其他资源释放才能继续。这就会出现这样的问题:同一个测试场景,用线程并发就会超时失败或报错,而用进程并发就没错。虽然会有区别,但两种方式的运行都会给服务端造成的压力是一样的。如何用loadrunner录制sqlserver测试一个sql语句或存储过程的执行本次通过loadRun