zoukankan      html  css  js  c++  java
  • Jmeter性能常见问题集锦

    1. java.net.BindException: Address already in use: connect

    img

    开始以为是单机运行脚本运行不过来,所以另加了一台负载机同时运行脚本

    分布式环境部署参考:r

    https://www.cnblogs.com/whitewasher/p/6946207.html

     

    但是依然还是会报错,后面查阅了相关资料后发现,是因为windows本身提供的端口访问机制的问题。

    Windows XP提供给 TCP/IP链接的端口为 1024-5000,并且要四分钟来循环回收他们。就导致我们在短时间内跑大量的请求时将端口占满了。

     

     

    解决方案为:

    1.cmd中,用regedit命令打开注册表

    2.在 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters下,

      1 .右击parameters,添加一个新的DWORD,名字为MaxUserPort

      2 .然后双击MaxUserPort,输入数值数据为65534,基数选择十进制(如果是分布式运行的话,控制机器和负载机器都需要这样操作哦)

    3.修改配置完毕之后记得重启机器才会生效

     

    2. 在Windows机器上用Jmeter做性能测试,汇总下我自身遇到的错误和解决方案

     

    img

     

    java.net.BindException: Address already in use: JVM_Bind

    原因分析:压测服务器问题,由于并发太高,导致自身port不够用,需要调整机器的端口,可用netstat -ano看出来;去掉下面的/c查看详细端口占用

    定位:

    netstat -ano | find "10.215.70.172:443" | find "ESTABLISHED" /c
    50
    netstat -ano | find "10.215.70.172:443" | find "SYN" /c

    netstat -ano | find "10.215.70.172:443" | find "TIME_WAIT" /c
    2233

    解决方案:

    cmd中,用regedit命令打开注册表;在 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters下, 1)右击parameters,添加一个新的DWORD/QWORD,名字为MaxUserPort 2)然后双击MaxUserPort,输入数值数据为65534,基数选择十进制,重启电脑生效

    Nginx: 99: Cannot assign requested address for upstream

    如下链接解决方案:

    http://blog.51cto.com/12223582/1877316

     

    img

    img

    3. JMeter测试问题:address already in use

    在Windows Server 2003执行JMeter,当并发线程数较高时(尤其是测试机器还存在连接其他服务器的socket),可能会产生address already in use的异常。

    搜索一番,很多文章指出是Windows的bug。通过在测试机器添加注册表项MaxUserPort、TcpTimedWaitDelay,并设置恰当值可解决该错误(当没有这两个注册表项时);或者修改为合适的值(如果已经存在这两个注册表项)。

    方法:

    在运行JMeter agent的机器上上添加注册表条目MaxUserPort和TcpTimedWaitDelay,分别设置值为65534、30,以增大可分配的tcp连接端口数、减小处于TIME_WAIT状态的连接的生存时间。

    该方法确认对Windows Server也有效,因为在Windows Server 2003 R2上发现缺失MaxUserPort和TcpTimedWaitDelay。具体设置见下面的连接。

    解决方法:

    1. 打开注册表:ctrl+r 输入regedit

    2. 进入注册表,路径为:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters

    3. 新建DWORD值,(十进制)设置为30秒。名称:TcpTimedWaitDe,值:30

    4. 新建DWORD值,(十进制)最大连接数65534。名称:MaxUserPort,值:65534

    4. Non HTTP response code: java.net.SocketException/Non HTTP response message: Permission denied...

    最近在做性能测试过程中遇到了高并发时,后台监控各项指标都很正常,但是测试结果中很多Non HTTP response code: java.net.SocketException/Non HTTP response message: Permission denied: connect的错误,翻了一下帖子发现是system.properties中配置有些问题,特此记录一下,没有时间细分析,先上解决方法:

    修改%JMETER_HOME%/bin/system.properties文件中的java.net.preferIPv4Stack=true即可;

    https://blog.csdn.net/dilai0918/article/details/101588077

    5.java.net.SocketException: Socket closed问题

    解决方法: 将每条HTTP Request 添加以下配置 在这里插入图片描述 在Advanced中配置 implementation 选择HttpClient4,Connect 选择连接保持时间 单位为毫秒

    6. java.net.SocketException/Non HTTP response message: Connection reset

    user.properties:

    httpclient4.retrycount=1
    hc.parameters.file=hc.parameters

    hc.parameters:

    http.connection.stalecheck$Boolean=true

     

    7. Jmeter压测报错:Non HTTP response code: java.net.ConnectExceptionexception的解决办法

     

    前一段时间进行jmeter压测时,一直报错,查看了下日志才发现报了一堆Non HTTP response code: java.net.ConnectExceptionexception,直接jmeter就没发送到服务端

    img

     

    本想加个Constant Throughput Timer去进行控制qps从而避免错误率,可是那样qps就不是服务器的最大压力值了。

    想了好几种方法,也将jmeter.properties中的httpclienc.timeout调大去尝试,还是有这个错误

    img

     

    最后试了一下将client implementation配置成java,结果奇迹出现了,发送不出去的错误被避免了,qps的量也上来了

    img

    img

     

    总结:有加解密的情况下,默认的HTTPClinet在POST时会自动将特殊字符转义,然而Java在发送过程中却未处理;

    jmeter发送http请求时,implementation会有以下几种选项

    img

    JAVA:使用的是JAVA JVM提供的http方法,但有一定的限制,

    1、当jmeter释放一个请求后,同样的进程中可能不会再使用了;

    2、只使用于单进程模式;

    3、不支持虚拟主机,不支持相关的方法,不支持存储证书的请求

     

    HttpClient4.1:使用的是Apache HttpClient4.1部件

    空白:使用Http默认请求中配置或jmeter.properties中jmeter.httpsample中的配置

    8. Jmeter之Non HTTP response code: java.net.SocketException/Non HTTP response message: Permission denied: connect

    最近在做性能测试过程中遇到了高并发时,后台监控各项指标都很正常,但是测试结果中很多Non HTTP response code: java.net.SocketException/Non HTTP response message: Permission denied: connect的错误,翻了一下帖子发现是system.properties中配置有些问题,特此记录一下,没有时间细分析,先上解决方法:

    修改%JMETER_HOME%/bin/system.properties文件中的java.net.preferIPv4Stack=true即可;

    需要了解原因的可以参考该贴:

    https://blog.csdn.net/hualusiyu/article/details/53490183

     

    9. Connection reset

    Apache JMeter对启用SSL的应用程序执行性能和/或负载测试时,SSL套接字错误可能是经常遇到的麻烦,严重阻碍了您的测试工作。本文重点介绍如何通过相应地配置和调优JMeter来克服这些与连接相关的错误。

    在Jmeter中指示SSL套接字问题的错误消息示例包括:

    Non HTTP response code: java.net.SocketException Non HTTP response message: Connection reset`
    `Non HTTP response code: java.net.SocketTimeoutException Non HTTP response message: connect timed out`
    `Non HTTP response code: java.net.SocketTimeoutException Non HTTP response message: Read timed out
    建议#1:使用最新版本的JMeter

    强烈建议使用最新版本,以利用新的改进和组件。

    避免在最后一个版本之前使用早于3个版本的版本。

    建议#2:在JMeter中启用DEBUG模式

    将以下内容添加到jmeter.properties以启用JMeter Logger面板:

    jmeter.loggerpanel.display=true

    要通过JMeter菜单将日志级别增加到DEBUG:

    Options -> Log Level -> DEBUG 克服JMeter中的HTTPS套接字错误

    要通过log4j2.xml启用上下文和线路日志记录的调试模式:

    <Logger name="org.apache.http" level="debug" />
    建议#3:设置连接超时

    JMeter中的默认连接超时是开箱即用的20秒。为帮助诊断和解决套接字连接问题,增加此值通常很有帮助。为此,请在JMeter测试计划中为HTTP Request对象指定更高的连接超时。例如,设置为60000(毫秒)以将总超时增加到60秒。

    从“配置元素”选项中添加“HTTP请求默认”配置元素(即,右键单击测试计划并添加此“HTTP请求默认值”)。

    克服JMeter中的HTTPS套接字错误

    在“HTTP请求默认值”中,有一个选项 - 连接'超时(毫秒)'在此字段中指定您的连接超时值,它将应用于所有子采样器。如果在测试计划级别添加了“HTTP请求默认值”,则它将应用于所有采样器和所有线程组。

    克服JMeter中的HTTPS套接字错误

    要指定单独的连接超时,请在每个采样器的相同字段中指定。单个采样器连接超时将覆盖“HTTP请求默认”连接超时值。

    克服JMeter中的HTTPS套接字错误

    建议#4:延迟线程创建

    JMeter可以选择延迟线程创建,直到线程开始采样(即,在任何线程组延迟和线程本身的加速时间之后)。这允许非常大的线程总数,前提是不会有太多并发的线程。

    克服JMeter中的HTTPS套接字错误

    建议5:禁用并行下载

    JMeter使用更多资源来模拟浏览器并行获取嵌入资源,如css,gif,js和静态内容。如果有许多用户,则可能会创建太多线程,并且由于JMeter端的带宽争用而开始对响应时间产生负面影响。如果要模拟许多用户,建议禁用并行下载,因为JMeter不会模拟浏览器的缓存,浏览器也不会在后续请求中重新下载嵌入式资源。

    克服JMeter中的HTTPS套接字错误

    建议#6:配置受信任和客户端SSL证书

    如果您的应用程序服务器层上有内部签名或自签名证书,则需要将JMeter配置为将这些证书识别为有效。要解决此问题,请修改system.properties并使用相关的签名者证书配置信任库。

    # Truststore properties (trusted certificates)javax.net.ssl.trustStore=C:/trust.jksjavax.net.ssl.trustStorePassword=sample

    如果您的应用程序需要SSL客户端证书身份验证或授权,则需要创建密钥库并在指向该密钥库的system.properties文件中设置以下属性:

    # Keystore properties (client certificates)javax.net.ssl.keyStore=C:/key.jksjavax.net.ssl.keyStorePassword=sample
    建议7:调整JMeter SSL配置

    在jmeter.properties中设置下面的属性,以调整JMeter处理SSL会话,协议和密码的方式:

    要启用SSL会话共享:

    https.sessioncontext.shared=true

    设置默认HTTPS协议级别:

    https.default.protocol=TLSv1.2

    要启用多个HTTPS协议:

    https.socket.protocols=TLSv1 TLSv1.2

    要启用多个密码:

    https.cipherSuites=TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA256

    要在测试期间保留SSL上下文:

    https.use.cached.ssl.context=true

    在http 4上设置重试次数

    httpclient4.retrycount=1
    建议#8:启用陈旧连接检查

    为避免HTTP连接池出现问题,可能需要在JMeter中启用陈旧连接检查。在JMeter测试运行期间接收“Socket Closed”异常时,应使用此步骤。要启用过时连接检查,请在user.properties中设置以下属性:

    http.connection.stalecheck$Boolean=true
    建议#9:在Web服务器上启用HTTP Keep-Alive

    Keep-Alive是HTTP协议的一个非常重要的特性。它允许客户端通过单个TCP连接发出多个HTTP请求。这提供了很大的性能提升,因为否则建立许多TCP连接将产生大量不必要的网络开销。

    建议#10:检查负载均衡器配置

    如果负载测试遇到负载均衡器前端的应用程序,请确保负载均衡器配置了足够的最大连接限制以处理预期负载。同样,验证负载平衡算法不会将过多的流量偏向一个或多个应用程序服务器实例,并且该负载充分分散在应用程序服务器后端之间。

    9 .高并发下载tomcat下的文件时,发生java.net.SocketException: Connection reset解决方案

    (1)问题产生:使用500个线程并发下载tomcat工程中的一个文件时,服务器出现java.net.SocketException: Connection reset异常,

    客户端出现connect timeout;

    (2)分析认为是服务器连接超过最大并发数而重置,导致客户端连接超时;

    于是配置tomcat的配置文件,修改最大并发连接数:

    在/home/econf/apache-tomcat-6.0.20/conf目录下,修改server.xml 在<Connector port="8080" 标签内添加 maxThreads="500" minSpareThreads="50" maxSpareThreads="100" enableLookups="false" acceptCount="500"

    之后重启tomcat

    此问题解决

    10. Jmeter 遇到的问题:rc="Non HTTP response code: java.net.NoRouteToHostException" rm="Non HTTP response mess

    在使用Jmeter压测时,遇到日志中有大量的错误:

    rc="Non HTTP response code: java.net.NoRouteToHostException" rm="Non HTTP response message: Cannot assign requested address" 如下图:

    原因:Jmeter 发压机的端口不够用

    解决办法: 1. netstat|grep TIME_WAIT |wc -l 查看目前处在TIME_WAIT状态的值大不大 2. 检查系统sysctl中配置项:(/etc/sysctl.conf) net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_max_tw_buckets = 10000 (5000也OK,主要是前两个值) 3. 如果上面三个值都正常,cat /proc/sys/net/ipv4/ip_local_port_range 查看可使用的端口范围。如果是默认范围,可修改为:net.ipv4.ip_local_port_range = 1024 65535 4. 执行:sysctl -p ,使设置立即生效。

    img

    11. 采坑汇总

    踩坑一:

    Response code: Non HTTP response code: java.net.SocketTimeoutException

    Response message: Non HTTP response message: connect timed out

    查看Load time的时间要大于request设置的connect time out时间,所以抛出该异常。可能是由于服务端有较多请求正在处理(且处理时间较长),导致JMeter不能连接上服务器而产生的。

    踩坑二:

    Java.NET.BindException: Address already in use: connect

    原因:短时间内new socket操作很多,而socket.close()操作并不能立即释放绑定的端口,而是把端口设置为TIMEWAIT 状态,过段时间(默认240s)才释放,(用netstat -na可以看到),最后系统资源耗尽(windows上是耗尽了pool of ephemeral ports ,这段区间在1024-5000之间)

    解决方法:在运行JMeter agent的机器上,添加注册表条目HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters

    MaxUserPort:最大动态端口数(Default = 5000, Max = 65534)

    TcpTimedWaitDelay:TCP等待延迟时间(30)

    TcpNumConnections:TCP最大连接数(Default = 16,777,214)

    MaxFreeTcbs:最大TCP控制块(1000-2000)

    MaxHashTableSize:最大TCB Hash table数量(64-65536)

    解析中值为10进制,下方脚本已全转换为16进制

    Windows Registry Editor Version 5.00

    "MaxUserPort"=dword:fffe

    "TcpTimedWaitDelay"=dword:1e

    "TcpNumConnections"=dword:fffffe

    "MaxFreeTcbs"=dword:7D0

    "MaxHashTableSize"=dword:10000

    踩坑三:

    java.lang.OutOfMemoryError: Java heap space

    原因:观察运行jmeter机器的内存,占用较高,超过了jmeter设置的内存上限。

    解决方案:修改jmeter配置文件,调整内存可用的范围

    修改/bin/jmeter.bat文件:找到这2行

    set HEAP=-Xms256m -Xmx256m

    set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m

    改为:

    set HEAP=-Xms1024m –Xmx2048m(最大值不能超过系统内存的1/2)

    set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m

    踩坑四:

    Response code: Non HTTP response code: java.net.SocketTimeoutException

    Response message: Non HTTP response message: Read timed out

    发生该错误时,jmeter已经连接上服务器,查看load time没有超过设定的request timeout时间,错误可能的原因是,服务器那边未处理该线程的请求,或者为保证服务能力,断掉了连接。

    为了验证该猜想,持续大于半小时向服务器发送该并发数量的请求,一段时间后,request收到503的response,证明猜想。

    踩坑五:

    Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host:

    原因:分布式测试时,server和agent之间的连接有问题。单个机器排查后,发现是某个agent机器安装了多个网卡,rmi远程的时候找的是虚拟机的网卡,导致连接失败。

    解决方案:禁掉不使用的虚拟机网卡,测试之后再恢复。

    踩坑六:

    接口参数有中文时,请求后传参是乱码?

    内容编码设置为utf-8

    踩坑七:

    接口参数化有中文时,请求后传参是乱码?

    内容编码设置为gb2312

    踩坑八:

    请求接口响应乱码,编码问题修改配置文件:

    jmeter.properties中的sampleresult.default.encoding参数,改成sampleresult.default.encoding=utf-8

    jmeter安装路径,改参数E:jmeterapache-jmeter-3.0in文件jmeter.properties中

    #sampleresult.default.encoding=ISO-8859-1改为

    sampleresult.default.encoding=utf-8

    12. Jmeter问题集锦

    踩坑一:

    Response code: Non HTTP response code: java.net.SocketTimeoutException

    Response message: Non HTTP response message: connect timed out

    查看Load time的时间要大于request设置的connect time out时间,所以抛出该异常。可能是由于服务端有较多请求正在处理(且处理时间较长),导致JMeter不能连接上服务器而产生的。

    踩坑二:

    Java.NET.BindException: Address already in use: connect

    原因:短时间内new socket操作很多,而socket.close()操作并不能立即释放绑定的端口,而是把端口设置为TIMEWAIT 状态,过段时间(默认240s)才释放,(用netstat -na可以看到),最后系统资源耗尽(windows上是耗尽了pool of ephemeral ports ,这段区间在1024-5000之间)

    解决方法:在运行JMeter agent的机器上,添加注册表条目HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters

    MaxUserPort:最大动态端口数(Default = 5000, Max = 65534)

    TcpTimedWaitDelay:TCP等待延迟时间(30)

    TcpNumConnections:TCP最大连接数(Default = 16,777,214)

    MaxFreeTcbs:最大TCP控制块(1000-2000)

    MaxHashTableSize:最大TCB Hash table数量(64-65536)

    解析中值为10进制,下方脚本已全转换为16进制

    Windows Registry Editor Version 5.00

    "MaxUserPort"=dword:fffe

    "TcpTimedWaitDelay"=dword:1e

    "TcpNumConnections"=dword:fffffe

    "MaxFreeTcbs"=dword:7D0

    "MaxHashTableSize"=dword:10000

    踩坑三:

    java.lang.OutOfMemoryError: Java heap space

    原因:观察运行jmeter机器的内存,占用较高,超过了jmeter设置的内存上限。

    解决方案:修改jmeter配置文件,调整内存可用的范围

    修改/bin/jmeter.bat文件:找到这2行

    set HEAP=-Xms256m -Xmx256m

    set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m

    改为:

    set HEAP=-Xms1024m –Xmx2048m(最大值不能超过系统内存的1/2)

    set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m

    踩坑四:

    Response code: Non HTTP response code: java.net.SocketTimeoutException

    Response message: Non HTTP response message: Read timed out

    发生该错误时,jmeter已经连接上服务器,查看load time没有超过设定的request timeout时间,错误可能的原因是,服务器那边未处理该线程的请求,或者为保证服务能力,断掉了连接。

    为了验证该猜想,持续大于半小时向服务器发送该并发数量的请求,一段时间后,request收到503的response,证明猜想。

    踩坑五:

    Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host:

    原因:分布式测试时,server和agent之间的连接有问题。单个机器排查后,发现是某个agent机器安装了多个网卡,rmi远程的时候找的是虚拟机的网卡,导致连接失败。

    解决方案:禁掉不使用的虚拟机网卡,测试之后再恢复。

    踩坑六:

    接口参数有中文时,请求后传参是乱码?

    内容编码设置为utf-8

    踩坑七:

    接口参数化有中文时,请求后传参是乱码?

    内容编码设置为gb2312

    踩坑八:

    请求接口响应乱码,编码问题修改配置文件:

    jmeter.properties中的sampleresult.default.encoding参数,改成sampleresult.default.encoding=utf-8

    jmeter安装路径,改参数E:jmeterapache-jmeter-3.0in文件jmeter.properties中

    #sampleresult.default.encoding=ISO-8859-1改为

    sampleresult.default.encoding=utf-8

    13. JMeter测试问题:java.net.SocketTimeoutException: connect timed out,Read timed out

    1. JMeter测试计划线程组设置:Ramp-UP Period为5秒。勾选【delay thread creation until needed 】允许需要时创建线程。循环次数设为10。

    2. 线程组包含两个请求,分别是①上传数据,②下载数据。设置两个请求之间sleep 3000ms。其他为缺省设置。

    3. 每个请求connect time out:3000ms

    4. 每个请求response time out:3000ms

    分别以递增线程数执行测试,由两个agent分别执行。在线程数为500时,产生错误:

    错误1:Response message: Non HTTP response message: connect timed out

    错误分析:通过Load time值看,由于该线程耗费时间(3002)大于设置的connect time out(3000ms),因此抛出该异常。问题可能是由于服务端有较多请求正在处理(且处理时间较长),导致JMeter不能连接上服务器而产生的。

    JMeter原始错误信息:

    概要:

    Thread Name: 线程组 1-367

    Sample Start: 2013-07-05 11:04:17 CST

    Load time: 3002

    Latency: 0

    Size in bytes: 1677

    Headers size in bytes: 0

    Body size in bytes: 1677

    Sample Count: 1

    Error Count: 1

    Response code: Non HTTP response code: java.net.SocketTimeoutException

    Response message: Non HTTP response message: connect timed out

    详细信息:

    java.net.SocketTimeoutException: connect timed out

    at java.net.PlainSocketImpl.socketConnect(Native Method)

    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)

    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)

    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)

    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)

    at java.net.Socket.connect(Socket.java:529)

    at sun.net.NetworkClient.doConnect(NetworkClient.java:158)

    at sun.net.www.http.HttpClient.openServer(HttpClient.java:395)

    at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)

    at sun.net.www.http.HttpClient.<init>(HttpClient.java:234)

    at sun.net.www.http.HttpClient.New(HttpClient.java:307)

    at sun.net.www.http.HttpClient.New(HttpClient.java:324)

    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)

    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)

    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)

    at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.sample(HTTPJavaImpl.java:487)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1088)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1077)

    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:428)

    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)

    at java.lang.Thread.run(Thread.java:662)

     

    错误2:Response message: Non HTTP response message: Read timed out

    错误分析:通过返回错误信息看,发生该错误时,JMeter已经连接上服务器,但是产生read time out。从load time(2998)看,所用时间并没有超过设定超时时间(3000),因此错误不大可能是JMeter本身产生的。一种可能是,服务器那边未处理该线程的请求,或者为保证服务能力,断掉了连接。

    JMeter原始错误信息:

    概要:

    Thread Name: 线程组 1-10

    Sample Start: 2013-07-05 11:12:45 CST

    Load time: 2988

    Latency: 0

    Size in bytes: 2431

    Headers size in bytes: 0

    Body size in bytes: 2431

    Sample Count: 1

    Error Count: 1

    Response code: Non HTTP response code: java.net.SocketTimeoutException

    Response message: Non HTTP response message: Read timed out

    详细信息:

    at java.net.SocketInputStream.socketRead0(Native Method)

    at java.net.SocketInputStream.read(SocketInputStream.java:129)

    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)

    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)

    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)

    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:697)

    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640)

    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)

    at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:2300)

    at java.net.URLConnection.getHeaderFieldInt(URLConnection.java:579)

    at java.net.URLConnection.getContentLength(URLConnection.java:474)

    at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.readResponse(HTTPJavaImpl.java:230)

     

    关于JMeter结果指标值说明的:

    http://www.cnblogs.com/Carrie_Liang/archive/2008/11/10/1330997.html

    http://asmetg.blog.163.com/blog/static/105828863201111644313362/

     

    回到通常的情况,最近几天,当我为一项测试增加虚拟用户数量时,遇到了以下错误。我试图测试低至90个虚拟用户的J2EE应用程序,每个虚拟用户的启动时间为一秒钟,延迟之间的间隔为一秒钟。

    错误– jmeter.protocol.http.sampler.HTTPSampler:readResponse:java.net.SocketTimeoutException:读取超时

    错误– jmeter.protocol.http.sampler.HTTPSampler:原因:java.net.SocketTimeoutException:读取超时

    错误– jmeter.protocol.http.sampler.HTTPSampler:readResponse:java.net.SocketException:服务器中的文件意外结束

    我花了几个小时试图在互联网上找到有关此错误消息的信息,但是在阅读了一些主题并注意到Google返回的结果少于我的搜索结果之后,我开始想像这不是我的jmeter中的问题配置,但在应用程序本身。当然,这本来应该是寻找的第一位,但是我有点失去了注意力,考虑了所有其他可能的因素,例如JMeter Agent内存,Glassfish一侧的最大连接数,Glassfish一侧的最大线程数, EJB池效率,JDBC池效率等。

    因此,我首先尝试的是使用最少1个JMeter Agent(而不是3个)再次运行该测试,并将虚拟用户数量从1、2、4、6和10增加到10。一旦我开始对超过6个虚拟用户进行测试,错误就会开始出现。因此,我得出这样的结论:某些应用程序请求执行时间太长,使应用程序服务器的线程繁忙,并且不允许传入请求使用资源。

    因此,我再次在一个简单的JMeter GUI中运行了相同的测试,将线程组配置为10个虚拟用户。结果呢?我的要求之一是大约需要30秒才能完成(对于10个用户),而大约要花6秒(对于1个虚拟用户),再次运行测试,逐渐增加n个虚拟用户,仅证实了我的理论,即响应时间在增加与虚拟用户数量成比例(当然,我在想什么?

    很明显,当我的请求中有5个花了30秒以上才能完成(因此5个可用的http线程正忙)时,就没有空间容纳第六,第七等等。

    因此,对于仍然在寻找该错误的所有人,它在您的应用程序实现中占90%以上。某种东西正在占用资源,服务器断开了连接。以增量方式检查所有请求,并找到瓶颈。

    并且总是从最后一步开始(在这种情况下,我没有这样做!

    希望这会有所帮助。如果我找到了它,我肯定会使用它

     

     

    使用Jmeter做性能测试前需要修改的配置

    使用jmeter对多个项目做性能测试后发现,jmeter很多默认配置是无法支持我们直接开始性能测试任务的;所以在此本人收集了一些未修改配置时会出现的常见问题,并给出了对应的解决方案

    问题一:接口错误信息为java.net.BindException: Address already in use 原因: 短时间内new socket操作很多,而socket.close()操作并不能立即释放绑定的端口,而是把端口设置为TIMEWAIT 状态,过段时间才释放,(用netstat -na可以看到),最后系统资源耗尽(windows上是耗尽了pool of ephemeral ports ,这段区间在1024-5000之间)。 解决办法: 1.按win+R打开运行,输入regedit命令打开注册表; 2.在 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters下, 1)右击parameters,添加一个新的DWORD,名字为MaxUserPort 2)然后双击MaxUserPort,输入数值数据为65534,基数选择十进制 3.重启电脑

    问题二:运行jmeter脚本后无数据返回,jmeter server显示连接后就立即结束 原因: 这是刚接触jmeter工具不久的朋友,或者是在使用分布式部署之后容易犯的错误,Jmeter执行时未获取到参数化文件csv data set config地址中的数据 解决办法: jmeter测试数据slave机器一定要存放,并且master机器的csv测试数据地址要以填写slave机器的地址

    问题三:jmeter运行时报内存溢出OutOfMemoryError 原因: Jmeter预设的内存不足,需要手动修改 解决办法: windows环境下,修改jmeter.bat: set HEAP=-Xms256m -Xmx256m set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m 改为: set HEAP=-Xms512m -Xmx2048m set NEW=-XX:NewSize=256m -XX:MaxNewSize=1024m (此数据可根据自己电脑性能适当修改) linux环境下,修改jmeter.sh java $JVM_ARGS -Xms1G -Xmx5G -XX:MaxPermSize=512m -Dapple.laf.useScreenMenuBar=true -jar dirname $0/ApacheJMeter.jar “$@”

    问题四:jmeter乱码问题 解决办法: 在jmeter.properties 这个文件里面找到sampleresult.default.encoding=xx,后面xx改成utf-8,然后删除前面的注释符号#。 如jmeter的body里面中文显示不出来,可找到JSyntaxTextArea然后把以js开头的注释取消。 JDBC请求查询结果乱码,可在JDBC连接配置中将URL加上characterEncoding=UTF-8

    问题五:jmeter只有status信息,无response详细信息 原因: Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保留了status 解决办法: 修改jmeter.properties文件中Results file configuration。把所有和response相关False的项改为True

    1、修改物理内存

    使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jmeter.bat中增加了JVM_ARGS="-Xmx2048m -Xms2048m -Xmn256m -XX:PermSize=128m -Xss256k",但结果运行时间增加了,但最终还是报内存溢出,百度后按照网友的建议更改了如下设置后jmeter就没有再卡了:

    1、windows环境下,修改jmeter.bat: set HEAP=-Xms512m -Xmx4000m set NEW=-XX:NewSize=256m -XX:MaxNewSize=1024m 改为: set HEAP=-Xms256m -Xmx1024m set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m set PERM=-XX:PermSize=1024m -XX:MaxPermSize=1024m 根据经验,heap最多设置为物理内存的一半,默认设置为512M.如果heap超过物理内存的一半,可能运行jmeter会慢,甚至出现内存溢出,原因java比较吃内存,占CPU.

    注意:JDK32位的电脑Xmx不能超过1500m,最大1378m.否则在启动Jmeter时会报错:

     

    2、jmeter 录制 排除/包含模式设置

     

     

    设置包含模式及排除模式,若不设置,在录制完之后,可以把不需要的.css .jpg的行删掉。标准的包含模式及排除模式如下所列。

    i.       .* - all

    ii.       .*.png – png images

    iii.       .*.gif – gif images

    iv.       .*.jpg – jpeg images

    v.       .*.php

    vi.       .*.jsp

    vii.       .*.html

    viii.       .*.htm

    ix.       .*.js

     

     

    3、jmeter 可视化图形报告配置

     

    1、使用CMD 进入jmeter bin目录

    输入:jmeter -n -t (脚本路径) -l testLogFile -e -o (存放报告的路径)

    样本:jmeter -n -t C:Userssamsung-Desktop接口报告脚本登录页面+我的窝页.jmx -l testLogFile -e -o ./out

     

    2、对已有的CSV文件生成报告,需配置jmeter.properties

     

    配置修改:

     

    jmeter.save.saveservice.bytes = true
    # Only available with HttpClient4
    #jmeter.save.saveservice.sent_bytes=true
    jmeter.save.saveservice.label = true
    jmeter.save.saveservice.latency = true
    jmeter.save.saveservice.response_code = true
    jmeter.save.saveservice.response_message = true
    jmeter.save.saveservice.successful = true
    jmeter.save.saveservice.thread_counts = true
    jmeter.save.saveservice.thread_name = true
    jmeter.save.saveservice.time = true
    jmeter.save.saveservice.connect_time = true
    # the timestamp format must include the time and should include the date.
    # For example the default, which is milliseconds since the epoch:
    jmeter.save.saveservice.timestamp_format = ms
    # Or the following would also be suitable
    jmeter.save.saveservice.timestamp_format = yyyy/MM/dd HH:mm:ss如果需要Errors报告更详细,配置:jmeter.save.saveservice.assertion_results_failure_message = true使用事物控制器请确认Generate parent sample为未勾选

    对已有CSV日志文件生成报告

      命令:jmeter -g <log file> -o <Path to output folder>

    img

    参考:http://www.cnblogs.com/greattao/p/6813156.html

    4、上传图片

     

    某些浏览器(例如Firefox和Opera)在上传文件时不包含文件的全名。这可能导致JMeter代理服务器失败。一个解决方案是确保任何要上传的文件都位于JMeter工作目录中,方法是复制文件,或者在包含文件的目录中启动JMeter。

     

    5、记录在JMeter中本机不可用的基于HTTP的非文本协议

     

    您可能需要记录JMeter(自定义二进制协议,Adobe Flex,Microsoft Silverlight,...)默认情况下未处理的HTTP协议。虽然JMeter不提供本地代理实现来记录这些协议,但您可以通过实现自定义SamplerCreator来记录这些协议。此采样器创建者将将二进制格式转换为可添加到JMeter测试用例的HTTPSamplerBase子类。有关详细信息,请参阅“扩展JMeter”。

     

     

    6、JMeter4.0版本修改成中文界面

     

    img

     

    分布式压测配置修改及启动

    配置修改: 修改 master 配置 修改 jmeter.properties remote_hosts 字段值,IP 为分布式 agent 的 IP 和端口。端口默认值 1099。 remote_hosts=agent1IP:1099,agent2IP:1099

    修改 slave 配置 -Jserver.rmi.ssl.disable=true

    压测命令:

    分别在不同 slave 上启动分布式 agent jmeter-server -Jserver.rmi.ssl.disable=true -Djava.awt.headless=true -Djava.rmi.server.hostname=agent1IP

    jmeter-server -Jserver.rmi.ssl.disable=true -Djava.awt.headless=true -Djava.rmi.server.hostname=agent2IP master 机器上使用命令 jmeter -Djava.awt.headless=true -Jserver.rmi.ssl.disable=true -n -t c.jmx -R agent1IP,agent2IP -l test.jtl

     

    jmeter常见错误:

     

    • 错误一: Response code: Non HTTP response code: java.net.SocketTimeoutException Response message: Non HTTP response message: connect timed out

    查看Load time的时间要大于request设置的connect time out时间,所以抛出该异常。可能是由于服务端有较多请求正在处理(且处理时间较长),导致JMeter不能连接上服务器而产生的。

    • 错误二: Java.NET.BindException: Address already in use: connect

    原因:短时间内new socket操作很多,而socket.close()操作并不能立即释放绑定的端口,而是把端口设置为TIMEWAIT 状态,过段时间(默认240s)才释放,(用netstat -na可以看到),最后系统资源耗尽(windows上是耗尽了pool of ephemeral ports ,这段区间在1024-5000之间) 解决方法:在运行JMeter agent的机器上,添加注册表条目HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters MaxUserPort 65334 TcpTimedWaitDelay 30

    • 错误三: java.lang.OutOfMemoryError: Java heap space

    原因:观察运行jmeter机器的内存,占用较高,超过了jmeter设置的内存上限。 解决方案:修改jmeter配置文件,调整内存可用的范围

    修改/bin/jmeter.bat文件:找到这2行 set HEAP=-Xms256m -Xmx256m set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m 改为: set HEAP=-Xms1024m –Xmx2048m(最大值不能超过系统内存的1/2) set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m

    • 错误四: Response code: Non HTTP response code: java.net.SocketTimeoutException Response message: Non HTTP response message: Read timed out

    发生该错误时,jmeter已经连接上服务器,查看load time没有超过设定的request timeout时间,错误可能的原因是,服务器那边未处理该线程的请求,或者为保证服务能力,断掉了连接。 为了验证该猜想,持续大于半小时向服务器发送该并发数量的请求,一段时间后,request收到503的response,证明猜想。

    • 错误五: Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host:

    原因:分布式测试时,server和agent之间的连接有问题。单个机器排查后,发现是某个agent机器安装了多个网卡,rmi远程的时候找的是虚拟机的网卡,导致连接失败。 解决方案:禁掉不使用的虚拟机网卡,测试之后再恢复。

    jmeter**脚本运行的过程中,服务器性能参数没有明显变化(CPU,内存,I/O),但request的响应时间很长。**

    原因:观察jmeter agent机器网络使用情况,网络使用持续达到带宽的限制峰值。request 发送的过程中pending在网络中,实际并发的request并没有同一时间到达服务器,所以服务器没有明显变化。 解决方案:提高jmeter agent机器网络带宽。

    • 错误六:

    Connection timed out: connect

    java.net.ConnectException: Connection timed out: connect

    at java.net.DualStackPlainSocketImpl.connect0(Native Method)

    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)

    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)

    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)

    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)

    at java.net.PlainSocketImpl.connect(Unknown Source)

    at java.net.SocksSocketImpl.connect(Unknown Source)

    at java.net.Socket.connect(Unknown Source)

    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)

    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)

    at org.apache.jmeter.protocol.http.sampler.hc.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:318)

    at org.apache.jmeter.protocol.http.sampler.MeasuringConnectionManager$MeasuredConnection.open(MeasuringConnectionManager.java:114)

    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610)

    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)

    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)

    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)

    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:654)

    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:413)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.followRedirects(HTTPSamplerBase.java:1542)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.resultProcessing(HTTPSamplerBase.java:1636)

    at org.apache.jmeter.protocol.http.sampler.HTTPAbstractImpl.resultProcessing(HTTPAbstractImpl.java:519)

    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:493)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1189)

    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1178)

    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:491)

    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:425)

    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:254)

    at java.lang.Thread.run(Unknown Source)

    原因分析

    可能是因为端口号耗尽,一般一台服务器的端口号最多是65535个,建议使用该命令分别查看下压测机与服务器的端口使用情况,netstat -nat|grep -i 8080|wc -l,如果这个个数在6w左右,那可能就是端口号用尽,同时查看下大多数的端口状态,应该都是time_wait状态 解决方案: 如果是压测机,端口号用尽,那就增加压测机,使用jmeter分布式压测(jmeter默认开启keep_alive的) 如果数服务器,端口号用尽,最大的可能是服务器端开了短链接,把短链接配置变成长连接即可 因为如果服务器端是短链接,当jmeter每发起一个请求就会建立一次tcp三次握手,传输完数据后,连接其实没有关,连接状态是time_wait,下个请求来了,会重新开启一个新的端口,建立tcp三次握手,传输数据....,这样随着请求的越来越多,端口就会变得越来越少,所以端口很快耗尽,而且大多数端口都处于time_wait状态,如果服务器端也支持长连接,那么下次请求来了,就会在上次请求的通道上继续传输,端口使用率大大的降低,就有效的避免了端口耗尽问题。

     

    原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保留了status。 解决方法:修改jmeter.properties文件中Results file configuration。把所有和response相关False的项改为True。运行后将输出保存.jtl文件中。添加tree监听器,过滤只显示error request,可以查看到request和response的具体信息,从而判断出错原因。

    tree report**中显示socket time out相关的错误,如何判断是jmeter工具的原因,还是服务器的原因。**

     

     

  • 相关阅读:
    使用parted对大于2T的磁盘进行分区
    iso系统镜像刻录到光盘和U盘
    戴尔R710服务器安装系统——配置raid
    UltraISO 9.7.1.3519注册码
    H3C交换机配置vlan
    kvm创建新虚拟机
    Windows添加永久静态路由
    gitlab部署步骤+汉化
    php配置php_pdo_mysql模块
    为git服务器配置gitosis管理权限
  • 原文地址:https://www.cnblogs.com/crstyl/p/14497976.html
Copyright © 2011-2022 走看看