超出TCP連線埠數限制(MaxUserPort)引起的伺服器問題
阿新 • • 發佈:2021-12-23
昨天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"
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