操作系统会为TCP/IP服务预留临时端口,Jmeter在跑并发测试的时候每开启一个线程(new socket操作)就会占用一个临时端口,若TCP/IP端口被占完了,而且没有及时释放(socket.close()操作不能立即释放绑定的端口,而是把端口设置为TIME_WAIT状态,过段时间才会真正释放,默认是240s),就会出现Java.net.BindException: Address already in use: connect这种情况
从问题的原因分析,有两种解决方案,一是增加预留给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
linux
解决方法:
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
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
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
通过上述方法设置后,再次压测,还是会出现这个错误
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.
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
decorator.go(71) invoke err: rpc error: code = Unknown desc = delete session failed
定位到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 |