TIME_WAIT狀態連線過多的分析與解決
原理說明
一個連線的建立與斷開,正常過程至少需要來回7個包才能完成。
Each socket in TIME_WAIT consumes some memory in the kernel, usually
somewhat less than an ESTABLISHED socket yet still significant. A
sufficiently large number could exhaust kernel memory, or at least
degrade performance because that memory could be used for other
purposes. TIME_WAIT sockets do not hold open file descriptors (assuming
they have been closed properly), so you should not need to worry about a
"too many open files" error.
Time wait 中的每個套接字都會消耗核心中的一些記憶體,通常比 ESTABLISHED 套接字少一些,但仍然很重要。 一個足夠大可能耗盡核心記憶體,或者至少降低效能,因為記憶體可以用於其他目的。 Time wait sockets 不儲存開啟的檔案描述符(假設它們已經正確關閉) ,因此不需要擔心"開啟的檔案太多"錯誤。
The socket also ties up that particular src/dst IP address and port so it cannot be reused for the duration of the TIME_WAIT interval. (This is the intended purpose of the TIME_WAIT state.) Tying up the port is not usually an issue unless you need to reconnect a with the same port pair. Most often one side will use an ephemeral port, with only one side anchored to a well known port. However, a very large number of TIME_WAIT sockets can exhaust the ephemeral port space if you are repeatedly and frequently connecting between the same two IP addresses. Note this only affects this particular IP address pair, and will not affect establishment of connections with other hosts.
套接字還綁定了特定的 src / dst IP 地址和埠,因此在 TIME wait 間隔期間不能重用它。 (這是 TIME wait 狀態的預期用途。) 連線埠通常不是問題,除非您需要重新連線到相同的埠對。 大多數情況下,一方將使用臨時港口,只有一方錨定在一個著名的港口。 但是,如果在相同的兩個 IP 地址之間重複且頻繁地連線,大量的 TIME wait 套接字可能會耗盡臨時埠空間。 請注意,這隻影響這個特定的 IP 地址對,並不會影響與其他主機建立連線。
TCP 連線必須經過時間 2MSL 後才真正釋放掉(2MSL 的時間的用意 --- 為了保證 A 傳送的最後一個 ACK 報文段能夠到達 B.防止 “已失效的連線請求報文段”出現在本連線中.A 在傳送完最後一個 ACK 報文段後,再經過時間 2MSL,就可以使本連線持續的時間內所產生的所有報文段,都從網路中消失.這樣就可以使下一個新的連線中不會出現這種舊的連線請求報文段)
如果許多連線正在被快速開啟和關閉,可能會引起大量的 TIME_WAIT 連線。
這會引發埠資源或其他資源的消耗,如果達到上限,那麼就會引發建立新連線的障礙。
TIME_WAIT狀態的連線過多導致系統埠資源耗盡
大量的TIME_WAIT程序。簡單來說,每一個tcp連線關閉後,主動關閉方都會保留這個連線一段時間,這個時間內,這個連線的狀態是TIME_WAIT,埠資源不會被釋放。這個超時時間為2*MSL。RFC 793中規定MSL為2分鐘,實際由系統決定,通常在30-120s。這個網上有很多詳細解釋,這裡不過多闡述。因為連線的關閉釋放有一定時間,並不是程式執行完就立刻釋放埠資源,所以當申請的連線程序較多的時候,埠資源就不夠用了。系統預設可用的埠資源:
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
解決辦法:
1 擴大資源可用
# 擴大埠範圍,增加埠資源
net.ipv4.ip_local_port_range = 1024 65535
#開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0
net.ipv4.tcp_tw_reuse = 1
2. 優化自己的系統,減少短連線次數
因為tcp連線關閉後是有必要保留一段時間TIME_WAIT狀態的,我們的目標不應該是簡單的縮短TIME_WAIT時間,而是應該從根本上去優化我們的系統架構設計,減少不必要的短連線請求。
參考資料
引用:https://www.zybuluo.com/zhongdao/note/1466543
What is the cost of many TIME_WAIT on the server side? 在伺服器端進行多次 TIME wait 的成本是多少?
https://stackoverflow.com/questions/1803566/what-is-the-cost-of-many-time-wait-on-the-server-side
(傳輸層)TCP協議
http://www.cnblogs.com/kzloser/articles/2582957.html
TIME_WAIT狀態的連線過多導致系統埠資源耗盡問題(2)
https://www.cnblogs.com/wangsili/p/3958371.html