1. java.net.BindException: Address already in use: connect
开始以为是单机运行脚本运行不过来,所以另加了一台负载机同时运行脚本
分布式环境部署参考:r
https://www.cnblogs.com/whitewasher/p/6946207.html
但是依然还是会报错,后面查阅了相关资料后发现,是因为windows本身提供的端口访问机制的问题。
Windows XP提供给 TCP/IP链接的端口为 1024-5000,并且要四分钟来循环回收他们。就导致我们在短时间内跑大量的请求时将端口占满了。
解决方案为:
1.cmd中,用regedit命令打开注册表
2.在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下,
1 .右击parameters,添加一个新的DWORD,名字为MaxUserPort
2 .然后双击MaxUserPort,输入数值数据为65534,基数选择十进制(如果是分布式运行的话,控制机器和负载机器都需要这样操作哦)
3.修改配置完毕之后记得重启机器才会生效
2. 在Windows机器上用Jmeter做性能测试,汇总下我自身遇到的错误和解决方案
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_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下, 1)右击parameters,添加一个新的DWORD/QWORD,名字为MaxUserPort 2)然后双击MaxUserPort,输入数值数据为65534,基数选择十进制,重启电脑生效
Nginx: 99: Cannot assign requested address for upstream
如下链接解决方案:
http://blog.51cto.com/12223582/1877316
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。具体设置见下面的连接。
解决方法:
打开注册表:ctrl+r 输入regedit
进入注册表,路径为:\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
新建DWORD值,(十进制)设置为30秒。名称:TcpTimedWaitDe,值:30
新建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即可;
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就没发送到服务端
本想加个Constant Throughput Timer去进行控制qps从而避免错误率,可是那样qps就不是服务器的最大压力值了。
想了好几种方法,也将jmeter.properties中的httpclienc.timeout调大去尝试,还是有这个错误
最后试了一下将client implementation配置成java,结果奇迹出现了,发送不出去的错误被避免了,qps的量也上来了
总结:有加解密的情况下,默认的HTTPClinet在POST时会自动将特殊字符转义,然而Java在发送过程中却未处理;
jmeter发送http请求时,implementation会有以下几种选项
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
要通过log4j2.xml启用上下文和线路日志记录的调试模式:
<Logger name="org.apache.http" level="debug" />
建议#3:设置连接超时
JMeter中的默认连接超时是开箱即用的20秒。为帮助诊断和解决套接字连接问题,增加此值通常很有帮助。为此,请在JMeter测试计划中为HTTP Request对象指定更高的连接超时。例如,设置为60000(毫秒)以将总超时增加到60秒。
从“配置元素”选项中添加“HTTP请求默认”配置元素(即,右键单击测试计划并添加此“HTTP请求默认值”)。
在“HTTP请求默认值”中,有一个选项 - 连接'超时(毫秒)'在此字段中指定您的连接超时值,它将应用于所有子采样器。如果在测试计划级别添加了“HTTP请求默认值”,则它将应用于所有采样器和所有线程组。
要指定单独的连接超时,请在每个采样器的相同字段中指定。单个采样器连接超时将覆盖“HTTP请求默认”连接超时值。
建议#4:延迟线程创建
JMeter可以选择延迟线程创建,直到线程开始采样(即,在任何线程组延迟和线程本身的加速时间之后)。这允许非常大的线程总数,前提是不会有太多并发的线程。
建议5:禁用并行下载
JMeter使用更多资源来模拟浏览器并行获取嵌入资源,如css,gif,js和静态内容。如果有许多用户,则可能会创建太多线程,并且由于JMeter端的带宽争用而开始对响应时间产生负面影响。如果要模拟许多用户,建议禁用并行下载,因为JMeter不会模拟浏览器的缓存,浏览器也不会在后续请求中重新下载嵌入式资源。
建议#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 ,使设置立即生效。
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_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
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:\jmeter\apache-jmeter-3.0\bin文件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_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
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:\jmeter\apache-jmeter-3.0\bin文件jmeter.properties中
#sampleresult.default.encoding=ISO-8859-1改为
sampleresult.default.encoding=utf-8
13. JMeter测试问题:java.net.SocketTimeoutException: connect timed out,Read timed out
JMeter测试计划线程组设置:Ramp-UP Period为5秒。勾选【delay thread creation until needed 】允许需要时创建线程。循环次数设为10。
线程组包含两个请求,分别是①上传数据,②下载数据。设置两个请求之间sleep 3000ms。其他为缺省设置。
每个请求connect time out:3000ms
每个请求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_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下, 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:\Users\samsung-\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>
参考: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版本修改成中文界面
分布式压测配置修改及启动
配置修改: 修改 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_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 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工具的原因,还是服务器的原因。**
Jmeter性能常见问题集锦的更多相关文章
-
VueJS 开发常见问题集锦
由于公司的前端开始转向 VueJS,最近开始使用这个框架进行开发,遇到一些问题记录下来,以备后用. 主要写一些 官方手册 上没有写,但是实际开发中会遇到的问题,需要一定知识基础. 涉及技术栈 CLI: ...
-
JMeter性能监测插件介绍(三)
JMeter 性能监测插件介绍 压力测试过程中,能够随时对负载服务器的健康状况的把控是相当重要的,有了这些数据,我们才能准确分析出服务器负载瓶颈.JMeter 插件包现在能够支持服务器监控,可以在所有 ...
-
性能测试分享:jmeter性能监控(一)
性能测试分享:jmeter性能监控(一) poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908 ...
-
【Jmeter自学】Jmeter性能测试报告(八)
http://www.cnblogs.com/YatHo/p/6092599.htmlhttp://blog.csdn.net/xiaojianpitt/article/details/4821554 ...
-
JMeter性能监控插件PerfMon Metrics Collector
Jmeter性能监控插件由客户端插件和服务器端程序组成. 官方文档及插件下载地址https://jmeter-plugins.org/wiki/PerfMon/ 将插件 plugins-manager ...
-
Docker系列——InfluxDB+Grafana+Jmeter性能监控平台搭建(一)
在做性能测试的时候,重点关注点是各项性能指标,用Jmeter工具,查看指标数据,就是借助于聚合报告,但查看时也并不方便.那如何能更直观的查看各项数据呢?可以通过InfluxDB+Grafana+Jme ...
-
Docker系列——InfluxDB+Grafana+Jmeter性能监控平台搭建(三)
在之前系列博文中,已经介绍完了数据采集和数据存储,那数据如何展示呢?所以今天就专门来讲下数据如何展示的问题. 以前博文参考: Docker系列--InfluxDB+Grafana+Jmeter性能监控 ...
-
Jmeter性能测试之基础知识(一)
1. 官网下载Jmeter: 点这里, 下载完成解压即可 2. 启动: 进入解压后的bin目录, Windows点击jmeter.bat, Linux执行jmeter 3. 添加线程组(user) : ...
-
JAVA工程师面试常见问题集锦
集锦一: 一.面试题基础总结 1. JVM结构原理.GC工作机制详解 答:具体参照:JVM结构.GC工作机制详解 ,说到GC,记住两点:1.GC是负责回收所有无任何引用对象的内存空间. 注意: ...
随机推荐
-
java 过滤器
1.什么是过滤器? 过滤信息,执行的优先级高于 servlet 2.自定义过滤器的步骤 写一个普通java类,实现Filter接口 2.配置过滤器 web.xm中 import java.io.I ...
-
vim添加未识别文件类型
这里用.c的文件格式来识别.nc文件 $ cd ~/.vim/ftdetect $ vim nc.vim # nc.vim内容 # au BufRead,BufNewFilE *.nc set fil ...
-
intent属性
private String mAction;private Uri mData;private String mType;private String mPackage;private Compon ...
-
使用webdav实现文档共享
1.PC1上开启WebDAV的服务,添加创建规则:运行访问的路径.运行访问的用户(这里的用户是指PC1上的用户名和密码).访问权限
-
用的最多的Android Studio 快捷键
1.Ctrl+D,Ctrl+C 复制删除整一行 2.Ctrl+Alt+L 格式化代码 看起来更好看 3.Ctrl+Q 查看函数API定义 4.Atl+方向键 切换不同文档 平时用快捷键能够提高效率,少 ...
-
【LeetCode】3Sum 解决报告
这个问题是我目前的知识回答,不来,只有良好的网上搜索解决方案,发现 K Sum 它是一类问题,但是,互联网是没有更简洁的代码,我想对于谁刚开始学习的人.您可能仍然想看看这个问题该怎么解决,然后看看他们 ...
-
cordova/ionic打包流程
ionic android 手工打包指令手册 [工作平台要求] 安装 node.js.cordova.ionic(非必须) 等前端相关软件与组件(1)安装 Java-SDK,正确配置系统环境变量 JA ...
-
ZooKeeper系列(3):znode说明和znode状态
ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk 1.znode znode的官方说明:http://zookee ...
-
序列化serialize与反序列化unserialize
有利于存储和传递value(除了resource类型外),却不会丢失其原有类型和结构. serialize序列化时会调用魔术方法__sleep(); unserialize反序列化时会调用魔术方法__ ...
-
Confluence 6 配置快捷链接
快捷链接提供了提供了一个在 Confluence 中访问从常用资源的快速方法.当你创建一个快捷链接的时候,你需要为你的快捷链接 URL 指派一个 Key,用户可以在 Confluence 中只输入这个 ...