JMeter使用Concurrency Thread Group测试结束报Socket closed错误
根因说明
这个java.net.SocketException: Socket closed异常的核心原因是Concurrency Thread Group的线程终止逻辑与普通Thread Group存在差异:
- 普通Thread Group默认采用优雅停止逻辑:线程会完整跑完当前迭代的所有采样器、拿到服务端响应后才会被销毁,不会中途断开正在传输的HTTP连接,因此无报错。
- Concurrency Thread Group在达到预设的测试总时长、吞吐量总量阈值时,默认会直接中断正在运行的线程,不等当前采样器的请求/响应流程走完,主动关闭了正在使用的TCP连接,最终抛出Socket closed异常。你使用的
${__tstFeedback(ThroughputShapingTimer,1,10,10)}函数在测试末期触发线程回收逻辑时,也会优先匹配吞吐量目标,不会等待活跃请求执行完成。
可落地的解决/规避方案
- 方案1:调整Concurrency Thread Group优雅停机配置
找到并发线程组中的线程超时等待时间配置项(Stop thread if it is still running after X seconds),将该值设置为大于你测试中单个采样器最大响应时间的数值,比如接口最长响应时间为5s,可设置为10s,给活跃请求预留足够的执行完成时间,再销毁线程。 - 方案2:调整吞吐量塑形定时器的收尾规则
在Throughput Shaping Timer的调度规则末尾,添加一段低吞吐量的持续周期,比如最后30s保持1QPS的吞吐量,再梯度降至0,且该持续周期的长度需大于所有采样器的最大响应时间,确保测试末期所有已发起的请求都能正常执行完成。 - 方案3:修改JMeter全局停止配置
打开JMeter安装目录下bin/jmeter.properties文件,调整两个参数:- 将
jmeterengine.force.system.exit设置为false,禁止JMeter测试结束时强制退出进程 - 将
jmeter.exit.check.pause设置为大于最大响应时间的数值(单位为毫秒,比如20000代表20秒),让JMeter停止前预留足够时间等待活跃请求跑完
- 将
- 方案4:临时重试规避
针对HTTP采样器添加异常重试规则,仅对Socket closed这类客户端主动断连的异常配置1次重试即可,注意如果测试的是非幂等接口,不要开启重试,避免重复提交数据。
内容的提问来源于stack exchange,提问作者JustNatural
相关产品推荐
相关产品推荐

