You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter调高线程(用户)数参数时出现Connection refused报错排查

JMeter压测线程数超100触发Connection refused报错排查

问题背景

  • 测试场景:通过JMeter对自有应用开展性能测试
  • 异常触发条件:线程(模拟用户)数设置超过100时抛出连接拒绝报错
  • 已验证正常项:
    • 线程数提升至25000之前测试可正常运行
    • 部署应用的Docker容器处于运行状态
    • 经Postman访问验证,应用可正常接收连接,无访问异常

报错相关材料

报错截图

报错截图1
报错截图2
报错截图3

核心报错堆栈

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包,返回连接拒绝。
    修复操作:
    1. 调整宿主机内核参数,编辑/etc/sysctl.conf添加以下配置,执行sysctl -p生效:
      net.core.somaxconn = 4096
      net.core.netdev_max_backlog = 4096
      net.ipv4.tcp_syncookies = 1
      
    2. 启动容器时添加参数覆盖容器内默认内核配置:docker run --sysctl net.core.somaxconn=4096 你的其他启动参数
    3. 同步调大应用本身的连接队列配置,比如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内存不足也会报连接错误。
    修复操作:
    1. 修改JMeter启动脚本(jmeter.sh/jmeter.bat)里的JVM参数,把堆内存调大,参考配置:HEAP="-Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m"
    2. 在线程组对应的HTTP请求默认值中,勾选Use Keep-Alive,设置连接超时为10s、响应超时为30s,将HTTP连接池最大连接数设置为和线程数一致。
  • 压测机/宿主机临时端口耗尽
    高并发短连接场景下,系统默认的临时端口范围小、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:18:23