《运维排查篇 | 服务器产生大量的TIME_WAIT的原因你知道吗?》
《关于《 服务器产生大量的TIME_WAIT的原因你知道吗?》更正 (qq.com)》
但是那篇文章中的案例是 UNIX/Linux 类的服务器,而对于 windows 机器并没有介绍
当 windows 服务器产生大量 TIME_WAIT 的连接并且无法释放的时候,我们应该怎么办?
今天给大家分享一个真实的案例,让大家以后遇到这种情况的时候有一个基本的排查思路
案例现象
一个惬意的午后,咸鱼正在和女同事交流工作(打情骂俏)得不亦乐乎,突然一阵急促的手机信息提示音把咸鱼拉回了现实
”来告警了!“
老话常说:认真工作的男人最帅。只见咸鱼赶紧回到工位然后打开电脑开始排查问题起来
”咦?zabbix agent is not available “
看样子,应该是这台服务器上的 zabbix_agent 进程挂了,看一下 zabbix_agentd 进程状态
zabbix_agent 进程在呀
cmd 命令看下这台 agent 与 proxy 的网络连接
netstat -an | find '192.168.149.128'
发现网络连接是有的,但是连接的状态引起了咸鱼的注意
”怎么全是 TIME_WAIT 状态?“
这台 agent 设置的是主动模式,在主动模式下,agent 会与 zabbix server(proxy)的 10051 端口连接,然后把数据主动传给 zabbix server(proxy)
咸鱼发现,这台 agent 与 proxy 的连接的状态全是 TIME_WAIT ,要不重启一下 zabbix_agent 看看,将这些连接都释放掉
”WTF?释放不了?“,咸鱼发现重启 zabbix_agent 之后之前已建立的TIME_WAIT状态连接并未得到释放
而且日志提示:
......active check configuration update from [192.168.149.128:10051] started to fail (cannot connect to [[192.168.149.128]:10051]: [0x00002747] 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。)
定位问题
咸鱼根据 zabbix 日志给出的信息以及 cmd 命令的结果,大致知道了是什么原因
这台 agent 上存在大量的 TIME_WAIT 状态的 TCP 连接释放不了导致系统的套接字资源被耗尽,agent 无法与 proxy 建立正常连接
那什么是 TIME_WAIT 连接?
一般来讲,客户端(client)与服务端(server)之间的某个进程要进行通信时,在运输层层面来讲先要通过三次握手来建立TCP连接
通信结束后,需要关闭连接,这时候就要通过TCP的四次挥手来进行关闭连接了
从TCP四次挥手的过程我们可以看到,主动关闭连接的一端(注意这里是说主动关闭连接的一端,即 client 和 server 都可以是主动关闭连接的一端)在收到对方的FIN包请求之后,发送ACK包进行响应,这时候会处在TIME_WAIT状态
即:谁先发起关闭连接的请求,谁就存在 TIME_WAIT 连接
案例中的 agent 由于配置的是主动模式,主动模式下会主动建立(关闭)与 proxy 的连接,也就会存在 TIME_WAIT 状态
为什么要有 TIME_WAIT 连接?
- 首先,TIME_WAIT 状态使得 TCP 全双工连接的终止更加可靠
我们知道,网络的本质是不可靠的,四次挥手关闭 TCP 连接的过程中,最后一个 ACK 包是由主动关闭连接一端发出的
而这个 ACK 有可能在路上丢失,使得处在 LAST_ACK 状态的一端(server 端)接收不到,如果接收不到,server 就会超时重传 FIN 请求
所以 client 需要处在 TIME_WAIT 状态并等待 2MSL 时间来处理 server 重传的 FIN 请求,来使得 server 能够正常关闭
- 其次,TIME_WAIT 状态的存在可以处理延迟到达的报文
网络的本质是不可靠的,也就意味着 TCP 报文有可能会延迟到达,TIME_WAIT 状态时,两端的端口不能使用,要等到 2MSL 时间结束后才可以继续使用,并且在等待 2MSL 时间的过程中,任何迟到的报文都将被丢弃
这样就可以避免延迟到达的 TCP 报文被误认为是新 TCP 连接的数据,并且使得这些延迟报文在网络上消失
解决问题
其实,出现一定数量的TIME_WAIT连接是正常现象,但是在线上生产环境可能会出现极端的情况——大量的TIME_WAIT连接
大量的TIME_WAIT连接会占用系统本地端口,导致不能再创建新的TCP连接
既然已经知道问题的根本原因,解决方法也呼之欲出
- 方法一
关于 windows 存在大量无法释放的 TIME_WAIT 状态连接,微软提供了一个受支持的修复程序
但是需要联系微软官方去获取(好活!)
- 方法二
error WSAENOBUFS (10055) - Windows Client | Microsoft Learn
1、在Windows开始菜单中,单击“运行”
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!