ITPub博客

首页 > 数据库 > 数据库开发技术 > 运维排查篇 | Windows 产生大量 TIME_WAIT 连接

运维排查篇 | Windows 产生大量 TIME_WAIT 连接

原创 数据库开发技术 作者:咸鱼运维杂谈 时间:2023-02-07 19:58:00 0 删除 编辑

之前写过两篇关于服务器产生大量 TIME_WAIT 连接的原因以及解决办法

《运维排查篇 | 服务器产生大量的TIME_WAIT的原因你知道吗?》

《关于《 服务器产生大量的TIME_WAIT的原因你知道吗?》更正》


但是那篇文章中的案例是 UNIX/Linux 类的服务器,而对于 windows 机器并没有介绍


当 windows 服务器产生大量 TIME_WAIT 的连接并且无法释放的时候,我们应该怎么办?


今天给大家分享一个真实的案例,让大家以后遇到这种情况的时候有一个基本的排查思路




案例现象



一个惬意的午后,咸鱼正在和女同事交流工作(打情骂俏)得不亦乐乎


突然一阵急促的手机信息提示音把咸鱼拉回了现实


”来告警了!“


老话常说:认真工作的男人最帅。只见咸鱼赶紧回到工位然后打开电脑开始排查问题起来


”咦?zabbix agent is not available “


看样子,应该是这台服务器上的 zabbix_agent 进程挂了,看一下 zabbix_agentd 进程状态


zabbix_agent 进程在呀



cmd 命令看下这台 agent 与 proxy 的网络连接


发现网络连接是有的,但是连接的状态引起了咸鱼的注意


”怎么全是 TIME_WAIT 状态?“


这台 agent 设置的是主动模式,在主动模式下,agent 会与 zabbix server(proxy)的 10051 端口连接,然后把数据主动传给 zabbix server(proxy)


咸鱼发现,这台 agent 与 proxy 的连接的状态全是 TIME_WAIT ,要不重启一下 zabbix_agent 看看,将这些连接都释放掉


”WTF?释放不了?“,咸鱼发现重启 zabbix_agent 之后之前已建立的TIME_WAIT状态连接并未得到释放


而且日志提示:




定位问题


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


https://support.microsoft.com/en-us/topic/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-38c81adc-d990-c6f7-3689-91cca5d19a20


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



  • 方法二


https://learn.microsoft.com/en-us/troubleshoot/windows-client/networking/connect-tcp-greater-than-5000-error-wsaenobufs-10055

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

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

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


我们新增两个 key——MaxUserPort 或 TcpTimedWaitDelay


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


  • MaxUserPort

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


看下微软提供的说明


Value Name: MaxUserPortValue 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 可以更快地释放关闭的连接,并为新连接提供更多资源


看下微软提供的说明


An additional TCPTimedWaitDelay registry parameter determines how long a closed port waits until the closed port can be reused.


总之一句话:较高的 MaxUserPort  表示能产生更多 TIME_WAIT 状态连接,较低的 TcpTimedWaitDelay 表示套接字在 TIME_WAIT 状态中等待的时间更短


4、创建新的 REG_DWORD 值 TcpTimedWaitDelay,将此值设置为十进制30,即十六进制 0x0000001e。此值将等待时间设置为 30 秒


5、创建新的 REG_DWORD 值 MaxUserPort(可略)

这个值需要根据服务器的实际应用负载来修改,不建议盲目地按照网上的改成65534


一般来说,新增 TcpTimedWaitDelay 之后就能够解决这个问题了,如果还是解决不了,就可以考虑修改 MaxUserPort


PS:修改了注册表之后记得要重启机器!


解决完之后,在女同事们羡慕崇拜的目光下,咸鱼留下一个潇洒的背影,去茶水间泡枸杞去了


感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力

原文作者:咸鱼运维杂谈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
最新的技术文章首先发布在微信公众号:咸鱼运维杂谈 擅长Linux系统维护、开源软件维护、自动化运维等领域,博客主要偏向于学习笔记及经历分享

注册时间:2021-05-29

  • 博文量
    193
  • 访问量
    84245