发现问题的应用场景
  C/S结构程序,请求响应采用异步机制。即客户端发送一个请求后不是一直等待这个结果,客户端将请求存放在请求队列并获得一个JOBID,服务器运行后将运行结果存放在响应队列,客户端定时查看响应队列,根据JOBID定时从响应队列中获取结果。因此带来的测试问题是受服务器状态影响,客户端获取结果的次数不固定。

测试脚本示例
  lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=localhost:8080", LrsLastArg);
  lrs_send("socket0", "buf56", LrsLastArg);
  lrs_receive("socket0", "buf57", LrsLastArg);
  GetJobID();
  do{
  lr_think_time(0.3);
  lrs_send("socket0", "buf58", LrsLastArg);
  lrs_receive("socket0", "buf59", LrsLastArg);
  }while(!CheckStatus());
  其中buf56、57是发送请求,buf58、59是循环去获取结果并检查返回的标志位,若仍没有结果返回则在一定时间后循环获取结果,因此请求数不固定。

LR提示socket异常
  当我用lrs_create_socket创建连接之后,当这个socket连接的请求次数达到100次后,这个连接就不可用了,必须close后再重新create。LoadRunner提示错误:Error : socket0 - Software caused connection abort. Error code : 10053.

问题验证
  一开始认为是LoadRunner对Socket的支持问题,因为同样的测试方式在Rational Robot中可以通过。于是做了最简单的一个试验:
  1、用socket方式录制访问某个网页并保存(如baidu、或tomcat的默认页面)
  2、添加循环方式去访问
  结果证明在socket请求次数达到100后即无法再次访问了(少数次数可以达到一百零几)。
 
  脚本如下:
  #include "lrs.h"
  int i;
  Action()
  {
  lr_think_time(1);
 
  lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=appsvr01:8080", LrsLastArg);
  i=1;
  do{
  lrs_send("socket0", "buf0", LrsLastArg);
  lrs_receive("socket0", "buf1", LrsLastArg);
  lr_output_message("-------------lrs request times: %d ", i);
  i++;
  lrs_send("socket0", "buf2", LrsLastArg);
  lrs_receive("socket0", "buf3", LrsLastArg);
  lr_output_message("-------------lrs request times: %d ", i);
  i++;
  lrs_send("socket0", "buf4", LrsLastArg);
  lrs_receive("socket0", "buf5", LrsLastArg);
  lr_output_message("-------------lrs request times: %d ", i);
  i++;
  lrs_send("socket0", "buf6", LrsLastArg);
  lrs_receive("socket0", "buf7", LrsLastArg);
  lr_output_message("-------------lrs request times: %d ", i);
  i++;
  }while(i<200);
  return 0;
  }
 
  LoadRunner VUGen日志如下:
  ...
  lrs_send(socket0, buf2)
  Action.c(21): lrs_receive(socket0, buf3)
  Action.c(22): -------------lrs request times: 98
  Action.c(24): lrs_send(socket0, buf4)
  Action.c(25): lrs_receive(socket0, buf5)
  Action.c(26): -------------lrs request times: 99
  Action.c(28): lrs_send(socket0, buf6)
  Action.c(29): lrs_receive(socket0, buf7)
  Action.c(29): Mismatch (expected 1249 bytes, 1268 bytes actually received)
  Action.c(30): -------------lrs request times: 100
  Action.c(16): lrs_send(socket0, buf0)
  Action.c(17): lrs_receive(socket0, buf1)
  Action.c(17): Error : socket0 - Software caused connection abort. Error code : 10053.
  Abort was called from an action.
  Ending Vuser...
  Starting action vuser_end.
  vuser_end.c(12): lrs_cleanup()
  Ending action vuser_end.

新的发现
  在发现以上问题后百思不得其解之后即和一些测试朋友进行讨论交流,但同样没有什么头绪。在一次交流中意外发现朋友的测试脚本中连接的是80端口,于是推断他是用IIS作为测试服务器,突然意识到这是否和应用服务器也有关,立即采用IIS作为服务器进行测试,居然测试通过了,并没有出现Socket连接问题!随后用Weblogic进行测试也同样通过!

初步结论
  由以上的各种验证方法发现问题并非单独由LoadRunner引起的,而是和测试的应用服务器也有很大关系。仅当用LoadRunner测试Jboss、Tomcat服务器时才会出现这种问题,而对IIS、Weblogic等问题并不存在。但另有一个奇怪的问题是采用Rational Robot用同样的测试方法,所有的服务器类型都没有问题!

在查找的过程中突然发现了一些关于HTTP的信息,具体如下:
KeepAlive On
在HTTP 1.0中,一次连接只能作传输一次HTTP请求,而KeepAlive参数用于支持HTTP 1.1版本的一次连接、多次传输功能,这样就可以在一次连接中传递多个HTTP请求。虽然只有较新的浏览器才支持这个功能,但还是打开使用这个选项。

MaxKeepAliveRequests 100 
MaxKeepAliveRequests为一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。

KeepAliveTimeout 15
KeepAliveTimeout测试一次连接中的多次请求传输之间的时间,如果服务器  已经完成了一次请求,但一直没有接收到客户程序的下一次请求,在间隔超过了  这个参数设置的值之后,服务器就断开连接。

在对服务器配置文件进行了MaxKeepAliveRequests参数设置后,测试脚本请求次数顺利突破了原有的极限,问题都得到了解决!

---------------------------------------------------------------------------------------------------------------------------------------

测试场景: tomcat 做server, 使用LR 测试上传文件的性能。

LoadRunner总是报错:“Action.c(81): Error -27792: Failed to transmit data to network: [10053] Software caused connection abort”

解决方案:

(1)添加配置 maxKeepAliveRequests=”-1”

Description: The maximum number of HTTP requests which can be pipelined until the connection is closed by the server. Setting this attribute to 1 will disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 will allow an unlimited amount of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100.

(2)适当加大 connectionTimeout="60000"

Description: The number of milliseconds this Connector will wait, after accepting a connection, for the request URI line to be presented. The default value is 60000 (i.e. 60 seconds).

----------------------------------------------------------------------------------------------------------------------------------------------

在今天的测试过程中发现,socket请求连接时总是出错,code是10053,google后把问题已经解决了。关键的点就在于Web服务器(Tomcat/Jboss)的一个参数的配置. "MaxKeepAliveRequests"

MaxKeepAliveRequests为一次连接可以进行的HTTP请求的最大请求次数,其默认值为100。如果将其值设为-1便可支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。

知道了问题的原因,解决起来就好办了。可以修改或者添加tomcat配置文件server.xml中的连接器(<Connector ... />)的配置。

<Connector port="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
              maxKeepAliveRequests="-1"
               redirectPort="8443" />

maxKeepAliveRequests="-1"表示: 将支持在一次连接内进行无限次的传输请求

---------------------------------------------------------------------------------------------------------------------------------------------

问题描述:

在用winsocket协议录制脚本后,回放脚本结果报(Software caused connection abort,10053 error)。

现场解决过程:
   1、 经查资料,好多地方说这是由于脚本没有关联的原因,于是先对脚本进行参数化及关联,并确保这两项工作设置正确,然后回放脚本,结果脚本还报10053错误。

2、于是开始查HP官方资料及国外网站,结果有人说这是因为应用服务器keppalive参数设置过小,于是开始设置这些参数,结果脚本还报10053错。

3、郁闷至及,便将之先放到一边,三天后某一天突然灵感突发有了一个思想法:目前录制的脚本中打开了好多socket,那么是不是因为打开的多使得数据不能正确传输,于是立刻进行尝试,让脚本运行时每时每刻只有一个socket在打开,当这个socket运行上一会后再将其关闭新开一个新的。很类似将以下内容   
{
       lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=www.milivio.com.cn:80", LrsLastArg);
       lrs_send("socket0", "buf0", LrsLastArg);
       lrs_receive("socket0", "buf1", LrsLastArg);
       lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=www.milivio.com.cn:1433", LrsLastArg);
       lrs_send("socket1", "buf2", LrsLastArg);
       lrs_receive("socket1", "buf3", LrsLastArg);
       lrs_send("socket1", "buf4", LrsLastArg);
       lrs_receive("socket1", "buf5", LrsLastArg);
    }
修改为
{
       lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=www.milivio.com.cn:80", LrsLastArg);
       lrs_send("socket0", "buf0", LrsLastArg);
       lrs_receive("socket0", "buf1", LrsLastArg);
       lrs_send("socket0", "buf2", LrsLastArg);
       lrs_receive("socket0", "buf3", LrsLastArg);
       lrs_close_socket("socket0");
       lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=www.milivio.com.cn:1433", LrsLastArg);
       lrs_send("socket1", "buf4", LrsLastArg);
       lrs_receive("socket1", "buf5", LrsLastArg);
    }

这样一做,大功告成!

 
再不能解决的话:
1.有些socket要放在init里面,但是有些就不能,要放在Action里面,还有就是要关闭socket。
2.你发包过快,可以在收发包前增加点thinktime来解决。
3.你发了错误的包,比如包头根本不正确。从data.ws文件的send bufXX 发是会有问题的,最好是自己写函数打包。然后  
   调用 lrs_set_send_buffer()+lrs_send()发出去。
4.连接数是不是过多了,超过了最大限制(如:超过了数据库游标的最大设置数)
 查看ORACLE最大游标数:show parameter open_cursors;
   查看当前打开的游标数:select count(*) from v$open_cursor;
   修改ORACLE最大游标数:alter system set open_cursors=1000 scope=both;

LoadRunner Error code 10053,Software caused connection abort的更多相关文章

  1. testNG java.net.SocketException: Software caused connection abort: socket write error

    执行用例报错,提示 java.net.SocketException: Software caused connection abort: socket write error java.net.So ...

  2. Software caused connection abort: recv failed 错误介绍

    解决1: Software caused connection abort: recv failed java.net.SocketException: Software caused connect ...

  3. [转]Loadrunner Error code 10053 & Tomcat 连接器(connector)优化

    LoadRunner提示错误:Error : socket0 - Software caused connection abort. Error code : 10053. 在今天的测试过程中发现,s ...

  4. java.net.SocketException: Software caused connection abort: socket write error

    用Java客户端程序访问Java Web服务器时出错: java.net.SocketException: Software caused connection abort: socket write ...

  5. Software caused connection abort: socket write error

    Exception in thread "main" java.net.SocketException: Software caused connection abort: soc ...

  6. jmeter压测tcp协议接口:java.net.SocketException: Software caused connection abort: socket write error

    tcp接口,试压过程中,部分请求报如下错误: java.net.SocketException: Software caused connection abort: socket write erro ...

  7. Caused by: java.net.SocketException: Software caused connection abort: socket write error

    1.错误描述 [ERROR:]2015-05-06 10:54:18,967 [异常拦截] ClientAbortException: java.net.SocketException: Softwa ...

  8. FTP上传文件,报错java.net.SocketException: Software caused connection abort: recv failed

    FTP上传功能,使用之前写的代码,一直上传都没有问题,今天突然报这个错误: java.net.SocketException: Software caused connection abort: re ...

  9. Putty出现 Network error:Software caused connection abort

    使用centos7.5 用Putty连接使用没多久就会出现 Network error:Software caused connection abort #修改sshd配置文件.修改3项配置即可 vi ...

随机推荐

  1. Entity Framework Code First关系映射约定【l转发】

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  2. 我的项目7 js 实现歌词同步(额,小小的效果)

    在项目中须要做一个播放器,还要实现歌词同步的效果,就跟如今搜狗音乐的歌词同步差点儿相同,在网上查了一些关于这方面的.整理了一下,在这里,其有用这种方法能够吗? <!DOCTYPE html> ...

  3. knockoutjs -- if 绑定

    参考:http://knockoutjs.com/documentation/if-binding.html If 绑定用来控制一部分html标签是否生成在DOM树中(html标签有data-bind ...

  4. activeMQ Jms Demo

    概述 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经 ...

  5. hdu 4742 Pinball Game 3D(三维LIS&amp;cdq分治&amp;BIT维护最值)

    Pinball Game 3D Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. db.students.batchInsert is not a function :@(shell):1:1

    按照<mongdb权威指南>当使用version 3.4.1版本的mongodb,其中使用batchInsert函数进行对students集合进行批量插入 db.students.batc ...

  7. java基础学习总结——GUI编程(二) 未学习

    一.事件监听

  8. VLC命令行参数详解

    VLC命令行参数详解 2012-11-29 14:00 6859人阅读 评论(0) 收藏 举报 Usage: vlc [options] [stream] ...You can specify mul ...

  9. mark v1 SecurityConfig

    package cn.efunbox.cms.configuration; import cn.efunbox.afw.core.entity.ApiCode; import cn.efunbox.a ...

  10. ecshop的数据库getRow、getAll、getOne区别

    ECShop没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,大大减小了分发包的文件大小.另外,当网站需要做memcached缓存时,也可以 ...