1. 程式人生 > 其它 >超出TCP連線埠數限制(MaxUserPort)引起的伺服器問題

超出TCP連線埠數限制(MaxUserPort)引起的伺服器問題

昨天2臺Windows Server 2012伺服器出現奇怪的問題,自己竟然連不上自己的本機80埠,telnet 127.0.0.1 80也連不上,而更奇怪的是其它伺服器可以連線到這2臺伺服器的80埠。在這2臺伺服器上,瀏覽器打不開任何網站,但能ping通。重啟其中1臺伺服器後,被重啟的伺服器恢復正常。

伺服器用的是阿里雲的,開始以為是阿里雲的問題,向阿里雲提交了工單。在提交了 netstat -nat 的資訊後,阿里雲工程師很快定位出問題原因,是TCP MaxUserPort不夠用引起的,當時TCP連線的埠數是6000多,而Windows的預設最大TCP連線埠數(MaxUserPort)是5000。

知道這個原因後,上那臺還在故障中的伺服器,用netstat -n | find /C /I "established"

一看,果然超過了5000(如果用PowerShell,可以用命令Get-Counter -Counter \TCPv4\*檢視)。

從這個原因出發,所有的故障現象都有了合理的解釋:

  • 連不上自己的本機80埠:連線本機80埠,也需要客戶端TCP埠,沒埠可用當然連不上;
  • 其它伺服器可以連線到這2臺伺服器的80埠:其它伺服器只是連線這2臺伺服器已有的80埠,不需要額外的埠;
  • 瀏覽器打不開任何網站:瀏覽器訪問網站,建立TCP連線需要分配客戶端TCP埠;
  • 能ping通:ping走的是ICMP協議,不夠用的是TCP協議的埠,所以不受影響;
  • 重啟後恢復正常:佔用的TCP埠被重置,重新分配,還未達到5000的限制。

知道了真正原因,解決起來就很簡單,修改最大TCP連線埠數(MaxUserPort)限制,修改方法:在登錄檔HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

中新增名為MaxUserPort,型別為DWORD(32-bit),值為65543(10進位制)的專案並重啟計算機。