报错信息:tcp连接一直不释放,导致ecs连接数每个小时增加1000左右,到达两万左右导致系统崩溃。这是每天app服务需要重启两次

问题遇到的现象和发生背景 报错信息:tcp连接一直不释放,导致ecs连接数每个小时增加1000左右,到达两万左右导致系统崩溃。这是每天app服务需要重启两次
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达

img


到的结果

如果客户端不是自己设计的,那就服务器端超过多少时间杀死链接,如果是自己设计的,你可以考虑修改代码。
app退出和异常退出,都要判断是否链接服务器,有链接就关闭链接。

心跳报文,主动断链,然后重连

查一下TCP心跳机制,这个和具体实现有关。可以尝试提升心跳机制的实现,主动断链之后,然后进行重连。

Tcp连接出现大量ESTABLISHED连接解决方法_奔跑在路上的技术博客_51CTO博客 Tcp连接出现大量ESTABLISHED连接解决方法,TCP状态转移要点TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。 1、L 【图片】 https://blog.51cto.com/qiangsh/1980383 是说这种情况吧

增加心跳 然后检测到异常主动断掉。释放资源

这是用了httpclient连接池,但是每次都创建了新的连接池而没有复用连接池里的连接吧

使用单例模式试试

必须添加连接上限,超过上限的连接直接拒绝。需要通过增加服务器并用负载均衡实现高并发支持。对于合理上限下的连接,需要定时验证连接心跳,无效连接予以关闭。

通过修改keepalive配置为合适的值(如改为200秒)可以快速释放端口连接

img

参考链接:tcp连接断开后不释放的解决办法:https://www.cnblogs.com/uncleyong/p/11083528.html

如果是网站应用的话,应该是有人不停的刷新网页,也有可能是cc攻击。可以使用阿里云SCDN、Web应用防火墙或DDoS防护。

1、要解决这个问题最重要的还是需要在你的程序代码上主动释放连接;
2、# sysctl -a |grep tcp_keepalive可以查看操作系统连接保持默认是2小时,所以你如果每小时只新增1000左右的话是不会出现累计到2万+的,这个你需要再排查下;
3、你可以修改这个tcp连接是否时间(net.ipv4.tcp_keepalive_time)进行测试是否满足你的要求,一般不建议修改。
#echo X > /proc/sys/net/ipv4/tcp_keepalive_time

这个问题如果要治根,需要找出程序的bug在哪:

1、检查程序所有创建连接的地方,看看每个连接是否调用了close或其它类似释放资源的方法
2、如果使用了第三方依赖创建的连接,检查依赖中提供的SDK释放连接的方法是否调用,也可以搜索这个依赖的最佳实践
3、可以使用jstack,jmap等工具分析进程的内存情况,大概率可以找到线索
4、可以dump这个进程的内存,使用JDK自带的内存分析工具或者MAT工具分析内存,可以终极找出是哪个类哪个对象没有释放

请采纳,十分感谢!

你看看这篇文章 <<Tcp连接出现大量ESTABLISHED连接解决方法>>
https://blog.csdn.net/weixin_33868027/article/details/89822196

两种方式:

  1. 如果需要长时间保持连接,即尽管双方在一段时间内不发送数据,也要保持连接,知道某一方主动关闭。增加心跳机制,客户端定时向服务端发送信号,告诉服务端需要保持连接,服务端收到信号,重置超时时间。
  2. 如果仅仅是维持通信连接,增加超时机制,服务端一定时间没有接收到客户端消息,直接关闭连接。