还记得,那年那天,在我负责的一个模块的某台机器上出现了大量FIN_WAIT1的TCP连接(连上的是nginx监听的某端口)
问题现象:
1. 查询每一条处于FIN_WAIT1的连接客户端,发现客户端TCP状态仍然是ESTABLISHED
2. 这种连接会一直存在(对某一条进行监视,发现一个多小时后状态仍然不变)
3. 重启机器上的nginx进程,连接仍然存在
4. 执行命令 echo 3 > /proc/sys/net/ipv4/tcp_fin_timeout(默认值60s), 仍然没有效果
5. 大量内存因此被消耗
查了很久之后发现:
这种连接的产生是因为客户端程序异常,一直不处理报文,导致TCP Server端发送缓冲区塞满了数据,客户端自己的接收缓冲区里也填满了数据
Server因为收发包失败后在应用层调用了close,于是Server端TCP状态机进入FIN_WAIT1,但是这个FIN也发不出去(Server被憋死了...)
Server端这种连接叫做orphaned connection(no longer referenced by any application)
通过设置 /proc/sys/net/ipv4/tcp_max_orphans可以限制orphaned connection的最大数量,最后我们也是通过设置这个值强行回收了内存...
找到一篇相关的文章介绍,感兴趣的同学可以看一下
http://huoding.com/2014/11/06/383
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。