win2008开机497天后未关闭TIME_WAIT端口
故障上报
开发同事反馈,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