转自:MSSQL技术交流群 群友的文档
TCP端口耗尽分析报告
1、问题描述
2022年4月1日早上10点左右收到客户报障说,OA系统的批处理作业无法运行。
2、环境描述
当前是一个2节点的故障转移群集数据库 版本为SQLServer 2008
3、问题分析
3.1 查看数据库报错信息
可以看到当前SqlServer 代理无法无法登录数据库执行相关作业,导致4月1日的作业没有任何作业自动执行
尝试手工执行其中一个作业报错如下,提示无法访问连接服务
通过分析,该链接服务器正常。
3.2 查看系统日志
通过分析系统的日志可以发现操作系统无法连接域控制器建立连接。通过测试发现当前节点无法与其它服务器建立连接,本地使用SSMS也无法连接,而别人是可以连接进来的。
通过查询微软官方网站发现如下相关错误信息。
端口消耗问题疑难解答 - Windows Client Management | Microsoft Docs
于是推测是由于TCP端口耗尽的问题。
3.3 查看操作系统版本
可以看到当前系统版本为windowsserver 2008 SP 1,这就与一个windows20008 TCP端口耗尽的bug联系起来了。
3.4 查看当前TCP端口使用情况
执行netstat -n 查看当前网络端口使用情况,可以看到当前本地端口已经使用到了65535端口。
3.5 查看TCP端口设置
可以看到当前TCP设置为默认起始端口为49152,端口数为16384,即最大端口数为65536已经被消耗殆尽
netsh int ipv4 show dynamicport tcp
从49152端口号开始 一直到65536 一共16384个 TCP动态端口
4、问题总结与处理建议
4.1 原因总结
- OA批处理无法执行原因
批处理是通过SQL代理来执行的,SQL代理需要连接到数据库进行执行,SQL代理服务因为运行在节点63上面,它没有本地端口使用所以无法连接自己的SQLServer数据库执行作业,从而导致报错。
- TCP端口被消耗殆尽的原因
cmd 运行 systeminfo
当前操作系统为windows2008 SP1,查询系统的启动时间为2020年10月31日,到故障时间为止已经运行500多天,这应该是windows2008系统的一个bug<在操作系统运行497 天后未关闭 TIME_WAIT 状态的所有 TCP/IP 端口>,这也是导致批处理无法正常执行的根本原因。
4.2 临时解决办法
目前已经已经通过增加TCP端口个数暂时解决批处理问题。
1、请以管理员身份打开CMD,运行如下命令: netsh interface ipv4 show tcpstats netsh int ipv4 show dynamicport tcp 查看一下,是否端口耗尽,目前端口数量是多少,如果确认端口耗尽。 2、 增大动态端口数量 netsh int ipv4 set dynamicport tcp start=1025 num=60000 其中1025是起始端口号,num为数量,上述命令意思为从1025开始的60000个端口,到61025结束。 注:该步骤无需重启机器, 立即生效 修改后运行命令检查配置 3、 降低Time Wait时间,最低为30秒 打开注册表,定位到 HKLM/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters 新增键值 TcpTimedWaitDelay,类型REG_DWORD , 设置为十进制30 注:修改后重启生效 以上是对ipv4下的tcp协议操作,其他协议命令如下: netsh int ipv4 show dynamicport tcp netsh int ipv4 show dynamicport udp netsh int ipv6 show dynamicport tcp netsh int ipv6 show dynamicport udp 简单的例子如下: netsh int ipv4 set dynamicport tcp start=10000 num=1000 netsh int ipv4 set dynamicport udp start=10000 num=1000 netsh int ipv6 set dynamicport tcp start=10000 num=1000 netsh int ipv4 set dynamicport udp start=10000 num=1000
4.3 后续解决方案建议
- 定时重启操作系统避免运行时间超过497天。
- 安装对应的BUG修复补丁。