JMeter测试出现java.net.SocketException: Connection reset问题求助
JMeter长响应场景下Connection reset问题解决
问题描述
单用户JMeter测试场景中,页面响应时间超过4分钟时,触发java.net.SocketException: Connection reset错误;但浏览器执行相同操作,即使响应耗时5分钟仍能正常完成。
错误堆栈日志
java.net.SocketException: Connection reset at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:313) at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:340) at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:789) at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1025) at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:483) at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:477) at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70) at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1461) at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1066) 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:939) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:650) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1301) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1290) 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:1623)
已尝试的无效配置
- user.properties 文件:
http.connection.stalecheck$Boolean=true httpclient4.retrycount=1 hc.parameters.file=hc.parameters httpclient4.time_to_live=600000 - jmeter.properties 文件:
https.default.protocol=TLSv1.2 https.socket.protocols=TLSv1.2 https.use.cached.ssl.context=true server.rmi.ssl.disable=true hc.parameters.file=hc.parameters http.connection.stalecheck$Boolean=true httpclient4.retrycount=1 httpclient4.time_to_live=600000 - HTTP请求默认设置:
- Implementation = HttpClient4
- Timeouts (毫秒): Connect: 600000 & Response: 600000
解决方案
1. 配置Apache HttpClient底层超时参数
创建或修改与jmeter.properties同目录的hc.parameters文件,添加以下内容(300000毫秒=5分钟,可按需调整):
http.socket.timeout=300000 http.connection.timeout=300000 http.connection-manager.timeout=300000
2. 调整连接池或禁用长连接
- 若连接池中的闲置连接被服务器重置,可在HTTP请求采样器中取消勾选
Use keepalive,禁用长连接; - 在
user.properties中调整连接池最大闲置时间,确保大于响应超时:httpclient4.max_idle_time=300000
3. 检查服务器端超时策略
浏览器正常但JMeter报错,可能是服务器针对不同客户端设置了差异化超时,需确认:
- 服务器的连接超时、响应超时配置;
- 负载均衡器/反向代理的超时设置(如Nginx的
proxy_read_timeout)。
4. 切换HTTP客户端实现
将HTTP请求的Implementation从HttpClient4切换为Java,绕过HttpClient的连接限制。
5. 启用TCP保活机制
在user.properties中添加配置,防止中间网络设备因长时间无数据传输断开连接:
httpclient4.socket.tcpkeepalive=true
内容的提问来源于stack exchange,提问作者Manoj Wadhwa
相关产品推荐
相关产品推荐

