运维排查篇 Windows 产生大量 TIME_WAIT 连接_windows time_wait(1)

本文讲述了Windows服务器中zabbix_agent由于TIME_WAIT状态的TCP连接过多导致的问题,解释了TIME_WAIT状态的原因和作用,并提供了两种解决方法,包括微软的官方修复程序和修改注册表参数。此外,还分享了作者的IT职业历程和学习资源。

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

”咦?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 状态连接,微软提供了一个受支持的修复程序

All the TCP/IP ports that are in a TIME_WAIT status are not closed after 497 days from system startup in Windows Vista, in Windows 7, in Windows Server 2008 and in Windows Server 2008 R2 - Microsoft Support

但是需要联系微软官方去获取(好活!)

  • 方法二

error WSAENOBUFS (10055) - Windows Client | Microsoft Learn

1、在Windows开始菜单中,单击“运行”

2、在运行对话框中输入 ”regedit“ 后按回车打开注册表编辑器

3、在注册表编辑器中打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters”路径

在这里插入图片描述
我们新增两个 key——MaxUserPort 或 TcpTimedWaitDelay

在新增之前,先来看下这两个 key 是怎么用的

  • MaxUserPort

表示当应用程序向系统请求获取可用的用户端口时,TCP/IP 可指定的最大端口号

看下微软提供的说明

Value Name: MaxUserPort
Value Type: DWORD Value data: 65534 Valid Range: 5000-65534 (decimal) Default: 0x1388 (5000 decimal) Description: This parameter controls the maximum port number that is used when a program requests any available user port from the system. Typically, ephemeral (short-lived) ports are allocated between the values of 1024 and 5000 inclusive.

  • TcpTimedWaitDelay

表示从关闭连接开始直到这个连接能够释放并重用的时间

这段时间,是 2MSL 时间,称为两倍最大段生存期

缺省为240秒,最低为30秒,最高为300秒。建议设为30秒

通过降低 TcpTimedWaitDelay 的值,TCP/IP 可以更快地释放关闭的连接,并为新连接提供更多资源

看下微软提供的说明

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

mg-SCIkiHil-1712928415699)]

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-2GlD6iKk-1712928415700)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值