轉自: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修復補丁。
 
