天天看點

超出TCP連接配接端口數限制(MaxUserPort)引起的伺服器問題

昨天2台Windows Server 2012伺服器出現奇怪的問題,自己竟然連不上自己的本機80端口,telnet 127.0.0.1 80也連不上,而更奇怪的是其它伺服器可以連接配接到這2台伺服器的80端口。在這2台伺服器上,浏覽器打不開任何網站,但能ping通。重新開機其中1台伺服器後,這台伺服器恢複正常。

昨天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進制)的項目并重新開機計算機。

tcp