JMeter调高线程(用户)数参数时出现Connection refused报错排查
JMeter压测线程数超100触发Connection refused报错排查
问题背景
- 测试场景:通过JMeter对自有应用开展性能测试
- 异常触发条件:线程(模拟用户)数设置超过100时抛出连接拒绝报错
- 已验证正常项:
- 线程数提升至25000之前测试可正常运行
- 部署应用的Docker容器处于运行状态
- 经Postman访问验证,应用可正常接收连接,无访问异常
报错相关材料
报错截图



核心报错堆栈
org.apache.http.conn.HttpHostConnectException: Connect to 127.0.0.1:8080 [/127.0.0.1] failed: Connection refused (Connection refused) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl$JMeterDefaultHttpClientConnectionOperator.connect(HTTPHC4Impl.java:404) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) 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:935) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:646) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1296) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1285) at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:638) at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558) at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489) at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256) at java.lang.Thread.run(Thread.java:748) Caused by: java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:607) at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) ... 19 more
根因排查与修复方案
按优先级从高到低逐一验证:
- 应用/Docker侧TCP连接队列溢出
这是高并发下连接拒绝最常见的原因。Docker容器默认的somaxconn参数通常只有128,应用框架(Tomcat、Spring Boot、Nginx等)默认的连接等待队列也偏小,并发超过100时全连接队列被打满,内核会直接丢弃新的SYN包,返回连接拒绝。
修复操作:- 调整宿主机内核参数,编辑
/etc/sysctl.conf添加以下配置,执行sysctl -p生效:net.core.somaxconn = 4096 net.core.netdev_max_backlog = 4096 net.ipv4.tcp_syncookies = 1 - 启动容器时添加参数覆盖容器内默认内核配置:
docker run --sysctl net.core.somaxconn=4096 你的其他启动参数 - 同步调大应用本身的连接队列配置,比如Spring Boot修改
server.tomcat.accept-count=4096,Nginx在监听端口配置后加backlog=4096
- 调整宿主机内核参数,编辑
- Docker端口转发性能瓶颈
如果使用默认bridge网络做端口映射,流量会经过docker-proxy转发,高并发下很容易出现丢连接的问题。
修复操作:
优先改用host网络模式启动容器:docker run --network host 你的其他启动参数,直接跳过docker-proxy转发环节,性能和物理机部署无差异。如果必须使用bridge模式,需要调大nf_conntrack连接跟踪表大小,避免连接跟踪记录满了丢包。 - JMeter侧配置不足
JMeter默认配置仅适配低并发压测,高并发下连接池、JVM内存不足也会报连接错误。
修复操作:- 修改JMeter启动脚本(
jmeter.sh/jmeter.bat)里的JVM参数,把堆内存调大,参考配置:HEAP="-Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m" - 在线程组对应的HTTP请求默认值中,勾选Use Keep-Alive,设置连接超时为10s、响应超时为30s,将HTTP连接池最大连接数设置为和线程数一致。
- 修改JMeter启动脚本(
- 压测机/宿主机临时端口耗尽
高并发短连接场景下,系统默认的临时端口范围小、TIME_WAIT连接过多会导致无可用端口创建新连接。
修复操作:
编辑/etc/sysctl.conf添加以下配置,执行sysctl -p生效:net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.ip_local_port_range = 1024 65535
验证技巧:调整参数后从100线程开始逐步加压,每次加压后执行
ss -lnt查看应用监听端口的Send-Q数值,如果该值持续等于你设置的somaxconn值,说明连接队列仍然不足,需要继续调大参数。如果Postman访问正常但JMeter持续报错,优先排查JMeter所在压测机的端口资源、JVM配置问题。
内容的提问来源于stack exchange,提问作者Prabitha
相关产品推荐
相关产品推荐

