今天在使用本地(Windows)Jmeter对远程服务器进行压力测试的时候,发现异常率非常的高,但是项目中日志没有报错误,然后观察TCP链接数排除了服务端的嫌疑,发现随着压测的进行,TCP连接数越来越少。打开日志输出发现报了大量的以下错误:
java.net.BindException: Address already in use: connect
百度后,原因为:
Windows
提供给 TCP/IP
链接的端口为 1024-5000
,并且要四分钟来循环回收他们。就导致我们在短时间内跑大量的请求时将端口占满了。
解决办法如下:
cmd
中,用regedit
命令打开注册表
第一步:增加动态分配到客户端 TCP/IP
套接字连接的临时端口的上限。
- 在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
下:- 右击
parameters
,添加一个新的DWORD
,名字为MaxUserPort
- 然后双击
MaxUserPort
,输入数值数据为65534
,基数选择十进制
- 右击
第二步:降低客户端 TCP/IP
套接字连接的超时值(默认值为 240
秒)
-
在注册表中,浏览到并单击以下注册表项。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
-
在“编辑”菜单中单击“新建”、“
DWORD
值”,然后添加以下注册表值,以缩短关闭连接时,该连接处于TIME_WAIT
状态的时间。当连接处于TIME_WAIT
状态时,套接字对无法重新使用:- 右击
parameters
,添加一个新的DWORD
,名字为TcpTimedWaitDelay
- 然后双击
TcpTimedWaitDelay
,输入数值数据为一个30
到240
之间的数字,基数选择十进制
- 右击
-
重启电脑
完成以上步骤后,异常率大大降低。