由于模拟并发请求会占用一个端口,和远程来建立连接,但是windows本身提供的端口访问机制受到限制,在Windows操作系统中,端口号的使用受到一定的管理和限制。端口号1024到5000(或有时称为“动态端口”或“私有端口”范围的一部分,尽管这个范围的确切上限可能因Windows版本和配置而异)通常被用于TCP/IP连接
动态端口分配:
当应用程序需要建立TCP/IP连接时,如果没有指定特定的端口号,操作系统通常会从动态端口范围(包括1024-5000)中分配一个可用的端口给该连接。这个分配是临时的,并且每次连接时都可能不同。
端口回收:
当一个TCP/IP连接关闭时,其使用的端口会被标记为空闲,并返回到操作系统的空闲端口列表中。
回收时间主要取决于连接关闭的速度以及操作系统处理端口回收的效率。
在某些情况下,如系统资源紧张或网络负载较高时,端口回收的时间可能会稍长。
TIME_WAIT状态:
在TCP/IP协议中,当一个连接关闭后,其端口会进入TIME_WAIT状态,以确保所有与该连接相关的数据包都已正确传输和接收。
TIME_WAIT状态的持续时间通常为2倍的MSL(Maximum Segment Lifetime,报文最大生存时间),在Windows系统中,这个值默认为4分钟(240秒)。
在TIME_WAIT状态期间,端口不会被重新分配给其他连接
所以当我们压测的时候也就是相当于端口被占用完了所以报错
解决方法:
修改windows的注册表
WIN+R输入“regedit”后打开注册表编辑器。
导航到TCP/IP参数路径:
在注册表编辑器中,打开路径
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
1、右击Parameters,添加一个新的DWORD,名字为MaxUserPort,再添加一个TCPTimedWaitDelay
2、双击MaxUserPort,输入值为65534,基数选择十进制
TCPTimedWaitDelay:30 (也就是30秒就回收)
参考windows文档:
https://learn.microsoft.com/zh-cn/troubleshoot/windows-client/networking/connect-tcp-greater-than-5000-error-wsaenobufs-10055
添加链接描述
java.net.SocketException: Socket closedat java.base/sun.nio.ch.NioSocketImpl.endRead(NioSocketImpl.java:253)at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:332)at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:355)at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:808)at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:940)at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:651)at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66)at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1311)at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1300)at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651)at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570)at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501)at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268)at java.base/java.lang.Thread.run(Thread.java:842)
或者在jmeter安装目录的bin目录下,找到jmeter.properties并设置
httpclient4.retrycount=1 这个配置项的意思是在使用HttpClient 4这个HTTP客户端库时,对于失败的请求将尝试重试的次数设置为1次。
httpclient4.idletimeout=30000,那么这意味着如果一个连接在30秒内没有被使用,它将被关闭。