今天写了一个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"出现

lrs_receive函数超时问题相关推荐

  1. 关于select函数超时时间问题

    关于select函数超时时间问题 select函数使用 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,s ...

  2. python超时退出进程_Python如何实现让一个函数超时退出?

    你的意思是函数一直在做cpu密集型的计算任务吗?可以把任务分割,执行完一个小任务后检查是否超时,超时return,否则继续. 补充: 这样吧 # coding=utf-8 import datetim ...

  3. python怎么设置函数超时时间_在python运行时为函数设置超时秒数

    我遵循this解.在 我试图为我的函数during runtime设置超时秒数,这使我能够灵活地传递不同的timeout seconds,甚至不打开脚本(测试.py)在 在超时.py在from fun ...

  4. python超时处理_Python如何实现让一个函数超时退出?

    你的意思是函数一直在做cpu密集型的计算任务吗?可以把任务分割,执行完一个小任务后检查是否超时,超时return,否则继续. 补充: 这样吧 # coding=utf-8 import datetim ...

  5. TCP Connect 函数超时的问题

    TCP 客户端通过 connect 函数连接服务器时,若服务器此时不在线或者当前网络不正常,会在 connect 函数中阻塞(默认情况下系统使用阻塞式 socket),直到超时时间到达,而这个超时时间 ...

  6. 关于微信小程序,云开发中云函数超时定义

    在云函数中的定义里,有一个关于超时的概念,这里并不是程序实际运行的时间,而是一个预期运行的时间 比如一个程序跑下来仅用了 8ms 但是他一直在等待内部的异步操作执行完才会关闭,这里就是异步操作超时,导 ...

  7. python给函数设置超时时间_在 Linux/Mac 下为Python函数添加超时时间的方法

    我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做 timeout ,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常.(当然存在特殊 ...

  8. python给函数设置超时时间_在 Linux/Mac 下为Python函数添加超时时间

    我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做timeout,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常.(当然存在特殊情况 ...

  9. Linux超时时间为0,在 Linux/Mac 下为Python函数添加超时时间

    在 Linux/Mac 下为Python函数添加超时时间 收录于话题 #你不知道的 Python 71个 摄影:产品经理 产品经理亲自下厨 我们在使用 requests 这类网络请求第三方库时,可以看 ...

最新文章

  1. 微信小程序在web-view页面做分享,并且把分享的参数传递给小程序
  2. arm linux 识别新硬盘_嵌入式Linux系列第13篇:USB摄像头拍照
  3. php根据id查找条件怎么写_thinkphp where()条件查询
  4. COM 组件设计与应用(十一)
  5. 想做出让老板眼前一亮的可视化报告,这几个“心机”千万要有
  6. cassandra 数据库_使用Apache Cassandra构建分布式NoSQL数据库
  7. 【Python成长之路】机器学习:10+分类算法汇总学习
  8. 计算机考试dw操作题,职称计算机考试Dreamweaver训练题
  9. 【语音增强】基于matlab iir带阻滤波器语音增强【含Matlab源码 613期】
  10. 安装cdr2019卡在正在下载_cdr2019最新版下载-coreldraw2019安装包中文版 - 极光下载站...
  11. opnet之Aloha
  12. 网课题库接口搭建步骤
  13. Kde桌面程序启动器程序图标无法显示
  14. React从零到一Demo演练(上)
  15. 计算机网络:路由协议分类——IGP和EGP
  16. CCRC认证是什么,ISCCC与CCRC是什么关系?
  17. 【软件测试】学习路线资料整理摆脱迷茫,突破瓶颈(送给我迷茫的朋友)
  18. 一阶常微分方程(一)| 存在与唯一性定理 + 变量分离 + 齐次方程
  19. 深度学习入门笔记(五):神经网络的编程基础
  20. Mel频率倒谱系数-MFCC

热门文章

  1. Switch语句用法及案例
  2. Hadoop实现数据清洗ETL
  3. 蓝牙架构(6)—— 3 数据传输架构(3.1 核心传输载体)
  4. 大咖电子元件助手界面截图
  5. Spm12 入门教程
  6. java soap 解析_用Java解析SOAP响应
  7. python的学习笔记案例1--汇率兑换4.0
  8. 费马大定理:一部跨时代的惊险小说
  9. EMQ 助力阿里云洛神云网络构建新一代“亿级并发、百万级吞吐”NLB 网络型负载均衡系统
  10. 浅谈jdk-spi与dubbo-spi