`
gaofen100
  • 浏览: 1243203 次
文章分类
社区版块
存档分类
最新评论

lrs_receive函数超时问题

 
阅读更多

今天写了一个socket的脚本,但是遇到一个问题,就是lrs_receive的值如果和预期的不一样这个函数就会一直读取缓存区的值,如果一直获取不到匹配的内容,就会在这里浪费10秒来做这个无用功,所以这样在分析性能结果的时候就会导致误解,很多的响应时间都会浪费在这里。通过网络查询发现这篇文章写的内容和我遇到的问题有点相似,于是就着手尝试,果然解决了我的难题。

回放的过程中发现脚本回放的很慢,一个脚本在忽略think time的情况下回放竟然需要好几分钟,但事务的响应时间并不长。本以为在generator慢,在controller下会快一些,结果试了一下还是一样。

仔细查看回放log后发现在回放慢的事务中都包含了很长的wasted time,这就是回放慢的原因了。查找资料后才知道是由于录制时接收buffer的大小与回放时接收的buffer大小不同(Mismatch)产生的。LR中当遇到Mismatch时,会重新读取socket中的数据,直到超时为止。这个超时时间默认为10秒,可使用lrs_set_recv_timeout2函数进行修改。当脚本回放时mismatch很多时,自然就慢了,而且这个时间并不计入响应时间,而是计入wasted time。

修改了一些返回长度固定的buffer size,又把lrs_set_recv_timeout2设为5秒后,脚本回放时间大大缩短了,但有些数是据根据请求不同动态返回的,肯定会出现mismatch,暂时就没辙了,不过后面会说到解决办法。


参数化没什么特殊的,不再多说了,要注意的一点就是把原始值替换为参数时,有些数据中间有换行,容易遗漏。

这里主要说说动态关联。

Sockets协议中有3个用于关联的函数,分别是lrs_save_param、lrs_save_param_ex和lrs_save_searched_string。前两个函数都是根据偏移量和查找的数据的长度来定位所需要的数据,所以只适合于返回内容基本固定,只是所需要的数据动态变化,而且长度不变的情况,在本次测试中并不适用。第三个函数是根据左右边界来定位要查找的数据,正是我所需要的。lrs_save_searched_string与web协议中的web_reg_save_param函数作用基本一样,所不同的只是web_reg_save_param要放在需要关联的请求前,而lrs_save_searched_string是放在请求后。具体使用方法就看LR的帮助吧。

做到这一步时,脚本已经可以使用了,下面就开始在controller里进行简单的并发测试了。

并发测试过程中,问题又出现了。在并发情况下,经常会出现返回数据比较大的buffer接收不到,由于做了动态关联,没有接收到数据就导致关联失败,从而导致vuser fail掉。我们先开始以为是lrs_set_recv_timeout2设的太短,可是设为120秒情况依旧。仔细看了下lrs_receive的帮助才发现原来还有一个超时时间的设置,这个超时是从发出请求后等待返回数据的时间,使用lrs_set_recv_timeout进行设置,默认同样为10秒。把这个超时时间改为120秒,问题马上就消失了。

在查找问题的过程中,我们又发现了一个函数——lrs_set_receive_option,这个函数可以设置何时停止接收数据,有两种方式:Mismatch(不匹配)和EndMarker(结束符)。默认情况下是Mismatch起作用,Mismatch的默认值为MISMATCH_SIZE,也就是当buffer大小不同时停止接收,然后再重新读取buffer直到超时,从而产生wasted time。所以我就考虑使用EndMarker是否能解决这一问题,把所有动态返回的buffer都使用EndMarker选项进行接收后,果然不再出现wasted time了。

至此,这次测试中使用Sockets协议遇到的问题全部解决了


int i=0;
lrs_send("socket1", "buf220", LrsLastArg);
while( i!=68087)
{
lrs_receive("socket1", "buf221", LrsLastArg);
i=lrs_get_last_received_buffer_size ("socket1");
}

返回的数据是动态的,出现MISMATCH不奇怪,设置一下匹配时间的最大值就可以了!

lrs_set_recv_timeout2().


另外你这个代码有时通过是因为你接收的包大小刚好跟录制时的一样,即是68087,如果第一次接收的不是68087的话基本上死循环了,因为lrs_receive函数是读缓冲的,读过的缓冲会清掉,就是说第一次读的缓冲其实已经读了,不过大小不一致而已,那么你继续循环读的话根本不可能再读到那个完整的包了(被第一次读时清掉了),于是一直在等.你可以尝试用下面的函数:


lrs_set_receive_option(EndMarker, EndMarker_None ) //读取直到缓冲结束.
lrs_set_receive_option(EndMarker, StringTerminator , "\r\n") //读取直到"\r\n"符号出现.你可以根据自己的接收数据的结束符修改
lrs_set_receive_option(EndMarker, BinaryStringTerminator , "\\X00")读取直到二进制符号"\\X00"出现


分享到:
评论

相关推荐

    总结下LoadRunner 接收Mismatch问题的处理办法

    - 使用 `lrs_receive("socket2", "buf5", "Flags=MSG_PEEK", LrsLastArg);` 来实现接收数据的同时保留数据。 - 这样可以在后续的操作中再次访问相同的数据。 #### 五、优化 Socket 选项 最后,还可以通过设置 ...

    LoadRunner_Winsocket协议知识总结

    - **发送和接收数据**: 调用`lrs_send`和`lrs_receive`函数进行数据交换。 - **清理**: 最后调用`lrs_cleanup`释放资源。 #### 2.VuGen脚本格式说明 - **函数调用**: 每个函数调用都遵循一定的格式,通常包含函数...

    lrs_v3.7.0_develop_encrypted_updated_1.apk

    lrs_v3.7.0_develop_encrypted_updated_1.apk

    ADL_LRS_master行为数据采集

    "ADL_LRS_master"项目是利用Python语言实现的一个行为数据采集系统,它遵循了美国开放学习记录存储(ADL Learning Record Store, LRS)的标准,使得数据格式化且易于理解。 首先,我们要了解ADL LRS。ADL(Advanced...

    winsocket协议[参考].pdf

    `lrs_send()`和`lrs_receive()`函数用于发送和接收数据。`data.ws`文件记录了在Action中发送和接收的所有数据包内容。 理解并熟练使用Winsocket协议可以帮助你测试那些不依赖于特定协议或使用自定义通信协议的应用...

    loadrunnerSocket测试.pdf

    在事务处理方面,文档提到了lrs_receive函数用于接收来自Socket的数据。lrs_save_param_ex用于保存接收到的参数值,这里保存的是接收到的数据,其后缀为"ebcdic"说明了数据可能被编码转换。lr_end_transaction用于...

    International_Shipping_LRS_AS_S7-300_en

    International_Shipping_LRS_AS_S7-300_en.pdf 介绍了关于International_Shipping_LRS_AS_S7-300_en的详细说明,提供S7-300的技术资料的下载。

    11 LoadRunner中Scoket协议的使用1

    然后,我们可以使用 `lrs_send` 函数来发送信息到服务器端,并使用 `lrs_receive` 函数来读取服务器端的响应信息。 在 LoadRunner 中的 Socket 协议实现中,我们首先需要包含 `lrs.h` 头文件,然后定义一个 `Action...

    LRS_University:实验室

    【标题】"LRS_University:实验室" 涉及的主要知识点是关于LRS(Learning Resource System)在教育领域的应用,特别是围绕一个名为"LRS_University"的项目或平台。LRS是学习分析和教育技术领域的一个关键组件,它...

    LoadRunner使用说明(笔记,很乱)

    - **接收响应**:设置接收超时时间并通过`lrs_receive()`接收响应数据。 - **参数保存**:使用`lrs_save_param()`保存关键响应数据作为参数,例如响应码。 #### 四、测试结果分析 完成测试后,LoadRunner会生成...

    LRS_GAME:狼人杀游戏系统上帝端

    【LRS_GAME:狼人杀游戏系统上帝端】 “LRS_GAME:狼人杀游戏系统上帝端”是一个专为狼人杀游戏设计的开源系统,它允许开发者或爱好者构建自己的在线狼人杀游戏平台。这个系统的核心是上帝视角,即系统管理员或者...

    LR socket协议脚本开发

    - lrs_receive:接收服务端发送的数据。 - lrs_close_socket:关闭Socket连接。 - lrs_cleanup:终止Winsock DLL的使用。 在脚本编写过程中,需要根据协议规范来定义数据包格式。例如,服务端和客户端交互的...

    loadrunnerSocket测试宣贯.pdf

    2. 发送报文到Socket使用`lrs_send()`函数,如: ```c lrs_send("socket1", "buf2", LrsLastArg); ``` 其中,"buf2"是数据缓冲区的名称,需在data.ws文件中配置。 关于data.ws文件的配置,有以下要点: - `send...

    lr编写脚本教程

    对于Socket协议,LR提供了`lrs_create_socket`来创建连接,`lrs_send`发送数据,`lrs_receive`接收数据,最后使用`lrs_close_socket`关闭连接。在数据包的描述中,如`buf0`和`buf1`,它们存储在`.ws`文件中,记录了...

    LR接口测试

    使用`lrs_create_socket`函数,传递参数如"socket1"(Socket名称)、"TCP"(协议类型)、"RemoteHost=131.252.83.233:15017"(远程主机和端口),以及`LrsLastArg`来指示函数结束。如果成功创建,`lrs_create_socket...

    LRS_Beacon:用于检测信标和发送xAPI语句的基本代码

    这是使用EvoThings创建的一个简单文件,用于检测BTLE信标并发送xAPI语句。...这是一个早期版本,LRS是在./js/xapiwrapper.js文件中定义的,因为我懒得正确地执行它。 我将添加更多评论。 -安东尼

    Loadrunner之socket脚本参数化方法

    在这个示例中,`paraData`变量被用于存储参数值,通过`lrs_save_param_ex`函数将该值保存为参数,并在Data.ws中引用。注意,实际打印出来的`data_param`值将是`<para>`参数的实际数值。 **示例二:** 第二个示例...

Global site tag (gtag.js) - Google Analytics