如何解决Non HTTP response code: java.net.SocketException?是否仅需JMeter端处理?
问题描述
测试REST API时,即使以2 RPS的速率运行5-10分钟测试,仍会出现1-2次SocketException错误;提升至16 TPS运行超1小时,错误依然存在。希望仅通过JMeter端配置解决问题,无需修改应用端。
错误信息:
Response code: Non HTTP response code: java.net.SocketException
Response message: Non HTTP response message: Socket closed
已尝试的配置:
在user.properties中添加:
httpclient4.retrycount=1 hc.parameters.file=hc.properties
在hc.properties中添加:
http.connection.stalecheckBoolean=true
测试使用Throughput Shaping Timer搭配开启tstFeedback选项的bzm-Concurrency Thread group,线程数范围10-100。
JMeter端解决方案
以下是无需修改应用端,仅通过JMeter配置调整的可行方案:
1. 优化HTTP连接池与超时设置
- 在HTTP请求的Advanced标签中,设置合理的超时值:
Connect Timeout: 5000msResponse Timeout: 10000ms
- 在
user.properties中添加连接池配置,避免闲置连接被服务端主动关闭:httpclient4.idletimeout=60000 httpclient4.connection_pool_size=200idletimeout:设置连接闲置时长,避免超过服务端的闲置连接超时阈值connection_pool_size:根据线程数调整,确保有足够可用连接
2. 针对幂等接口启用智能重试
如果测试的REST API是幂等性接口(重复请求不会产生副作用),可配置自动重试:
- 在HTTP请求的Advanced标签中勾选
Retries,设置重试次数(如2次) - 在
user.properties中补充重试规则:httpclient4.retrycount=2 httpclient4.retry.httpstatus_codes=408,500,502,503,504 httpclient4.retry.exception.classes=java.net.SocketException,java.net.SocketTimeoutException
3. 临时禁用HTTP Keep-Alive
若服务端对Keep-Alive支持不佳,可尝试关闭该特性:
- 在HTTP请求的Advanced标签中取消勾选
Use KeepAlive - 或在
user.properties中添加:httpclient4.connection.stalecheck=false httpclient4.keepalive=false
4. 调整线程组与定时器配置
- 检查Throughput Shaping Timer的TPS曲线,避免短时间内线程数剧烈波动,减少连接频繁创建/销毁的情况
- 临时关闭
tstFeedback选项,改用固定线程数+Constant Throughput Timer测试,排查是否是动态线程调整引发的连接问题 - 添加HTTP Cookie Manager和HTTP Cache Manager,确保请求上下文一致性,避免无效连接请求
5. 升级JMeter版本
使用最新稳定版JMeter(如5.6.x及以上),新版本修复了HTTP客户端的已知连接问题,默认HttpClient4实现的稳定性更优。
内容的提问来源于stack exchange,提问作者NPAL
相关产品推荐
相关产品推荐

