裂开了,一次连接池参数导致的雪崩问题

本文讲述了作者在运维实时接口服务时,因连接池参数设置不当导致的雪崩问题。通过分析发现,由于未设置DefaultMaxConnectionsPerHost,每个host的最大连接数默认为2,限制了并发度,造成线程堆积、接口响应时间增加,最终导致实例挂死。解决方案包括仔细阅读技术文档、参考优秀开源项目和进行线下压测。

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

事件背景

我最近运维了一个网上的实时接口服务,最近经常出现Address already in use (Bind failed)的问题。

明显是一个端口绑定冲突的问题,于是大概排查了一下当前系统的网络连接情况和端口使用情况,发现是有大量time_wait的连接一直占用着端口没释放,导致端口被占满(最高的时候6w+个),因此HttpClient建立连接的时候会出现申请端口冲突的情况。

具体情况如下:

于是为了解决time_wait的问题,网上搜索了些许资料加上自己的思考,于是认为可以通过连接池来保存tcp连接,减少HttpClient在并发情况下随机打开的端口数量,复用原来有效的连接。

但是新的问题也由连接池的设置引入了。

问题过程

在估算连接池最大连接数的时候,参考了业务高峰期时的请求量为 1 分钟 1.2w pv,接口平响为 1.3s(复杂的广告推广效果模拟系统,在这种场景平响高是业务所需的原因),因此 qps 为 12000*1.3\60=260。

然后通过观察了业务日志,每次连接建立耗时 1.1s 左右,再留 70%+ 的上浮空间(怕连接数设置小出系统故障),最大连接数估计为 260 1.1 1.7 约等于 500。

为了减少对之前业务代码最小的改动,保证优化的快速上线验证,仍然使用的是HttpClient3.1 的 MultiThreadedHttpConnectionManager,然后在线下手写了多线程的测试用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值