天天看點

linux下短連結出現TIME_WAIT耗盡端口号的解決方法

最近使用C++開發libcurl庫通路OpenSearch程式,出現”Cannot assign requested address”錯誤,大量請求錯誤。Google後問題集中在linux下的TIME_WAIT上。

      出現TIME_WAIT的原因是短連接配接耗盡了系統的socket端口号,新的連接配接配置設定不到端口号,是以才産生的上述錯誤。

      短連結耗盡端口号的原因得從TCP/IP的底層說起。

linux下短連結出現TIME_WAIT耗盡端口号的解決方法

      TCP/IP關閉連結時會使用我們通常所屬的4次握手協定,這是就出現了服務端确認關閉連結後用戶端發送确認後還需要等待一段時間,這段時間用戶端會把連結置為TIME_WAIT狀态,通常TIME_WAIT時間為2個msl,大概為60s左右,根據伺服器設定而不同。

       出現TIME_WAIT後會導緻網絡通路緩慢,請求失敗等一系列的問題。為了解決這個問題就需要設定TIME_WAIT的時間。在網上搜了一大圈,方法都幾種在修改核心參數,修改的方式如下(實驗以後是沒有生效,解決不了問題,貼出來供大家參考):

       使用指令:vi /etc/sysctl.conf

       編輯檔案,加入以下内容:

       net.ipv4.tcp_syncookies = 1

       net.ipv4.tcp_tw_reuse = 1

       net.ipv4.tcp_tw_recycle = 1

       net.ipv4.tcp_fin_timeout = 30

       然後執行/sbin/sysctl -p讓參數生效。

net.ipv4.tcp_syncookies = 1表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;

net.ipv4.tcp_tw_reuse = 1表示開啟重用。允許将TIME-WAIT sockets重新用于新的TCP連接配接,預設為0,表示關閉;

net.ipv4.tcp_tw_recycle = 1表示開啟TCP連接配接中TIME-WAIT sockets的快速回收,預設為0,表示關閉。

net.ipv4.tcp_fin_timeout修改系統預設的TIMEOUT時間

      最後問了小康,最終搞定了,實在感謝小康。其實修改關鍵的核心參數是下面的:

      net.ipv4.tcp_tw_timeout = 3

     修改這個參數以後讓連結關閉以後處在TIME_WAIT 3s的時間。這個再看網絡連結,數量已經大大降低,從原先耗盡的端口,現在高并發通路最多占用4000個端口。

     分析一下第一種修改的timeout參數,從參數名稱上就可以看出來,其實是FIN_WAIT的時間,并不是TIME_WAIT的時間。隻是協定裡邊第一次等待的時間。為什麼修改的net.ipv4.tcp_tw_recycle = 1這個參數不起作用現在也還沒有搞清楚。

繼續閱讀