win2008开机497天后未关闭TIME_WAIT端口

故障上报

2017.03.01,开发同事反馈,sqlserver有时候能连上,有时候连不上。

分析过程

1、先执行 telnet x.x.x.x 1433 看到端口是通的,排除了网络连通性问题;

2、登录 SQL Server 服务器(OS版本为 Windows Server 2008 R2),在命令提示符下执行 netstat -ano 看到大量连接1433的端口处于 TIME_WAIT 状态(由于该机器只安装了SQLServer,所以没有其他的应用端口):

C:\Users\Administrator>netstat -ano

  协议   本地地址            外部地址                 状态           PID
  TCP    127.0.0.1:49224    127.0.0.1::1433         TIME_WAIT      0
  TCP    127.0.0.1:49225    127.0.0.1::1433         TIME_WAIT      0
  TCP    127.0.0.1:49226    127.0.0.1::1433         TIME_WAIT      0
  TCP    127.0.0.1:49227    127.0.0.1::1433         TIME_WAIT      0
  TCP    127.0.0.1:49228    127.0.0.1::1433         TIME_WAIT      0

发生原因

Microsoft 已经确认这是一个bug,具体参考 这里

症状

在系统启动时从 497 天后所有在TIME_WAIT状态的 TCP/IP 端口都不会被关闭。因此,TCP/IP 端口可能会被用光,并且可能不会创建新的 TCP/IP 会话。

受影响的版本

  • Windows Vista SP1 及 SP2
  • Windows Server 2008 及 SP2
  • Windows 7 及 SP1
  • Windows Server 2008 R2 及 SP1

解决方案

方案1

建议在业务低峰期,重启数据库服务器。

方案2

1、在 Win 2008 中,系统可用TCP端口数量并不是65535个,而是16384个(Win 2003默认4000个左右),使用如下命令可以确认:

C:\Users\Administrator>netsh int ipv4 show dynamicportrange tcp

协议 tcp 动态端口范围
---------------------------------
启动端口        : 49152
端口数          : 16384

2、在 Win 2008 中,使用如下命令动态调整服务器的可用 TCP/UDP 端口(Win 2003需要修改注册表项 MaxUserPort 并重启生效):

C:\Users\Administrator>netsh int ipv4 set dynamicportrange tcp start=10000 num=55535
确定。

3、再次确认一下,可用的端口数从默认的 16384 变为 55535 了,此办法只是临时增加可用TCP端口,但很快就会用完。

C:\Users\Administrator>netsh int ipv4 show dynamicportrange tcp

协议 tcp 动态端口范围
---------------------------------
启动端口        : 10000
端口数          : 55535
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2022-01-14 17:30:01

results matching ""

    No results matching ""