• windows server2008 SP1 TCP端口耗尽分析报告


    转自: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修复补丁。

    参考连接:从系统启动,Windows Vista 中、 在 Windows 7 中,Windows Server 2008 中和在 Windows Server 2008 R2 中的 497 天后未关闭 TIME_WAIT 状态的所有 TCP/IP 端口 (microsoft.com)

  • 相关阅读:
    Effective C# 原则50:了解ECMA标准(译)
    Effective C# 原则47:选择安全的代码(译)
    DevExpress小结(简略)
    Effective C#49:为C#2.0做好准备(译)
    Effective C# 原则45:选择强异常来保护程序(译)
    我在犹豫是不是该收集这几首MP3
    用C#预览视频文件(简略)
    DevExpress库的学习总结(简略)
    SharePoint 2010 隐藏快速启动栏(左侧导航)
    将 Excel 导入到 SharePoint 列表
  • 原文地址:https://www.cnblogs.com/gered/p/16105545.html
Copyright © 2020-2023  润新知