jmeter 压测问题

jmeter 压测问题

————

————

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

原因:

操作系统会为TCP/IP服务预留临时端口,Jmeter在跑并发测试的时候每开启一个线程(new socket操作)就会占用一个临时端口,若TCP/IP端口被占完了,而且没有及时释放(socket.close()操作不能立即释放绑定的端口,而是把端口设置为TIME_WAIT状态,过段时间才会真正释放,默认是240s),就会出现Java.net.BindException: Address already in use: connect这种情况

解决办法(在jmeter所在服务器操作):

从问题的原因分析,有两种解决方案,一是增加预留给TCP/IP服务的临时端口的数量,二是加快被占用端口的释放速度。

增加预留给TCP/IP服务的端口数量。

1.1 如果Jmeter的运行平台在Windows端。

在 Microsoft Windows XP 或 Windows Server 2003 中,由 Windows 套接字分配给应用程序的临时 TCP 或 UDP 端口号的最大值是由注册表设置 MaxUserPort 控制的,该参数的默认值为 5000。临时端口从端口号 1025 开始编号。因此,默认情况下,Windows XP 或 Windows Server 2003 会为执行通配绑定的应用程序分配一个范围从 1025 到 5000 的号码。

要在运行 Windows XP 或 Windows Server 2003 的计算机上更改临时端口的最大值,请执行以下操作:

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

2、在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

3、右键Parameters

4、添加新的DWORD,名字为MaxUserPort和TcpTimedWaitDelay

5、分别输入数值数据为65534和30,基数选择十进制;以增大可分配的tcp连接端口数、减小处于TIME_WAIT状态的连接的生存时间

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

TcpTimedWaitDelay:确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多连接,导致低吞吐量,则调整此参数。

1.2 调高你的web服务器的最大连接线程数,调到1024或者2048,以resin为例,修改resin.conf中的thread-pool.thread_max,如果你采用apache连resin的架构,别忘了再调整apache;

https://blog.csdn.net/gzh0222/article/details/6911676

java.net.NoRouteToHostException: 无法指定被请求的地址

linux

解决方法:

  1. 调低端口释放后的等待时间, 默认为60s, 修改为15~30s

​ echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout

  1. 修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0, 修改为1, 释放TIME_WAIT端口给新连接使用。

​ echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

  1. 修改tcp/ip协议配置,快速回收socket资源, 默认为0, 修改为1.

​ echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

输入sysctl -p即生效

Linux TCP连接数修改: https://www.cnblogs.com/clicli/p/5856486.html,https://www.cnblogs.com/cwp-bg/p/8377742.html

查看端口占用 netstat -natp|grep 9000 | grep ESTABLISHED | wc -l

优化

net.ipv4.ip_local_port_range=1024 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 40000
net.core.somaxconn = 40000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_keepalive_time = 1200

java.net.SocketException: Socket closed

https://www.cnblogs.com/yiyaxuan/p/12673496.html

如果在 HTTP Request Sampler 的 Basic 里勾选了Use KeepAlive,那么建议在 Advanced 页签下:

1、Implementation 选为 HttpClient4

2、Timeouts 中的 Connect 一般设置一个10~60秒的值,表示连接的空闲超时时间,避免由于没收到被压测端的响应回来的 Keep-Alive 的 Header 导致的连接断开

这个值的单位是毫秒:15s*1000=15000s

img

通过上述方法设置后,再次压测,还是会出现这个错误

jmeter 压测问题_第1张图片

java.net.SocketException: Connection reset

In user.properties file add the next 2 lines:

httpclient4.retrycount=1
hc.parameters.file=hc.parameters
In hc.parameters file add the following line:

http.connection.stalecheck$Boolean=true
Both files live in JMeter’s bin folder.

linux运行

jmeter -n -t ./testcase/rsa.jmx -l ./testcase/rsa.jtl

动态修改

(jmeter.bat -help | jmeter.sh -help可以看到帮助),使用__P() 函数来获取命令中指定的属性值。

jmeter -JthreadCount=2 -JRanpup=1 -Jcycle=2 -Jtime=40 -Durl=www.baidu.com -Dport=80 -n -t baidu.jmx -l baidu.jtl

说明:

threadCount=2为baidu.jmx测试计划要指定的线程数

-Jcycle=2为baidu,jmx测试计划要指定的每个线程的迭代次数

-JRanpup=1为baidu,jmx测试计划要指定的线程启动时间

在baidu.jmx测试计划中用${__P(threadCount,)}来获取threadCount的值

${__P(cycle,)}来获取cycle的值

${__P(time,)}获取持续时间

${__property(url,)}获取服务器ip

jmeter 压测问题_第2张图片 jmeter 压测问题_第3张图片

login 没带cookie 回来

decorator.go(71) invoke err: rpc error: code = Unknown desc = delete session failed

rsa没带公钥回来

定位到sync.map

http://c.biancheng.net/view/34.html

测 sync.map

线程数 循环次数 总样本量 响应次数
200 200 40000 40000
200 300 60000 60000
200 400 80000 63008
400 400 16000 79949
500 400 20000 101823
1000 400 400000 182616
1200 400 480000 240249

你可能感兴趣的:(jmeter,网络,windows)