Connection refused: connect

在一次项目压力测试中,作者遇到Tomcat处理大量并发请求时出现Connection refused错误。通过排查发现是由于线程池配置不当导致CPU占用过高及日志批量提交效率低下等问题。通过调整minSpareThreads参数有效缓解了这一状况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前做的一个项目中需要测试一下压力,没有测试人员,只好自己动手。循环开启线程,调用本地接口。

项目使用strut2和spring,tomcat,mysql

当线程数达到1000时,测试代码偶尔会报出Connection refused: connect的错误。

接下来各种查找错误,发现不太正常的情况如下:

1.调用时,系统cpu基本满额;

2.正常运行到1000的时候,会慢一下,才返回信息;


情况1:百度加自己测试后,发现因为用到strus2,所以接口每次收到请求都会创建一个线程安全的对象,然后处理请求的时候,各个线程切换,cpu就爆了。

情况2:因为接口需要记录日志信息,就用log来存储数据库,为了减少连接次数,会缓冲一部分数据后,才批量提交,刚好这个缓冲数是1000,顺带一句,批量提交时发现比较慢,后来发现自动提交忘记关了,等于没开批量一样。


后来想想,可能是tomcat没优化的问题,一看配置文件


<Executor maxThreads="1000" minSpareThreads="128" acceptCount="500"
				name="tomcatThreadPool" namePrefix="catalina-exec-" />

<Connector URIEncoding="utf-8" compressableMimeType="text ml,text/xml,text/javascript,text/css,text/plain,application/json,application/x-www-form-urlencoded"
				compression="on" compressionMinSize="256" connectionTimeout="20000"
				executor="tomcatThreadPool" noCompressionUserAgents="" port="8080"
				protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443" /> 
有优化的。仔细思考一下项目的情况后,发现原因可能是
minSpareThreads
配置太小吧。


因为根据配置文件看,tomcat接收上限是1000+500+接收时间内已经处理好的请求数,远远超出我的请求数,不可能是请求数不够,但是,我请求的时候cpu爆高,会不会是因为minspareThreads设置的太小,赶不上请求需要创建的线程数。

因此,将minspareThreads改成500后,这个异常就出现的非常低了。后续还要根据情况调整一下参数来适应使用场景。

目前还在测试,不知道什么时候能测好

### 连接被拒绝 (Connection refused: connect) 的常见原因及解决方案 当遇到 `java.net.ConnectException: Connection refused: connect` 错误,通常意味着客户端尝试建立到指定主机和端口的TCP/IP连接失败。这可能是由于目标服务未启动、防火墙阻止了请求或是配置不正确等原因造成的。 #### 1. 验证服务状态 确保目标应用程序正在监听预期的IP地址和端口号,并处于可接受新连接的状态。可以使用命令行工具如 `netstat`, `lsof` 或者特定于操作系统的其他方法来确认这一点[^1]。 对于SSH连接问题,检查SSH守护进程是否正常运行以及监听正确的接口和端口非常重要[^3]。 ```bash # Linux/Unix系统下验证某个端口是否开放 sudo netstat -an | grep LISTEN ``` #### 2. 检查防火墙设置 如果服务器上有活动的防火墙规则,则可能需要调整这些规则以允许来自客户端的入站流量。常见的Linux防火墙管理工具有iptables, firewalld等;而在Windows Server中则是通过级安全Windows Defender防火墙来进行配置。 针对SOCKS代理的情况,还需注意本地机器上的防火墙也可能影响与代理之间的通信,因此同样需对其进行适当配置[^2]。 #### 3. 审核网络路径 有即使两端的服务都已就绪,中间路由设备(路由器、交换机)也可能会阻碍直接通讯。此建议测试从同一局域网内的另一台计算机发起相同类型的连接请求,以此判断是否存在更广泛的网络层面障碍。 #### 4. 排除代理干扰 某些情况下,默认设置了HTTP(S)/SOCKS代理可能导致不必要的转发行为从而引发此异常。特别是在开发环境中像Android Studio这样的IDE内部可能存在自定义代理设定,应当仔细审查并移除任何不当的代理参数[^4]。 ```properties # Gradle配置文件中的代理设置示例(应删除) systemProp.http.proxyHost=your_proxy_host systemProp.http.proxyPort=8080 systemProp.https.proxyHost=your_secure_proxy_host systemProp.https.proxyPort=8080 ``` #### 5. 测试基本连通性 利用简单的ping命令或其他类似的诊断手段初步评估两节点间的可达性和延迟情况。虽然成功的ICMP回显并不完全代表TCP层面上的成功握手,但它确实有助于排除一些明显的物理链路故障。 ```bash # 向远程主机发送Ping包 ping remote_host_ip_or_domain_name ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值