Linux TCP 回收與重用

Linux 內核有兩個重要的設置,對於每秒處理上千個鏈接的高流量站點而言,是頗有用處的,這兩個設置就是tcp_tw_recycle 和tcp_tw_reuse。這些內核設置容許咱們在有新的客戶端鏈接時從新使用套接字(文件描述符)。儘管這兩個設置看起來很類似,其實倒是大相徑庭的,若不進行慎重的管理,內核會很快用完全部套接字而且會丟失相關的用戶數據。因爲客戶端鏈接和斷開有許多方式,因此,正如您所知道的,TCP/IP 也有多種狀態。這些狀態在netstat中是很明顯的,如SYN_SENT、ESTABLISHED, 還有很流行的TIME_WAIT, 還有其它許多不常見的狀態。linux


TIME_WAIT 狀態有一個關鍵問題,就是它的默認值爲120秒時長,它會用完全部有價值的iptables和TCP自己的資源。這樣作是爲了確保全部在線或經過差的網絡在傳輸額外的數據包或從新發送的數據包時不會錯誤地附加到新的鏈接中。可是,關鍵的問題是,任何新的鏈接在這兩分鐘內沒法使用任何套接字。儘管您能夠調整窗口大小,將其設置爲15-30秒,可是對於高流量系統而言,這仍舊是一個問題,由於這些站點每秒須要1000-5000個套接字,這些套接字就會處於等待狀態。在此,咱們來看一下兩個很是重要的內核設置。
網絡


tcp_tw_reuse 設置容許在TIME_WAIT 狀態下重複使用一對套接字,由內核確保不會有相似於重複序列號的問題。因爲兩端都使用了時間戳,因此可以避免序列號重複。也能夠基於某些關閉標識如FIN(表示不會有新的流量),來重複使用套接字。tcp


與tcp_tw_reuse設置相對的是tcp_tw_recycle,這是個設置不是很慎重而且徹底取決於客戶端的時間戳。這種作法對於NAT系統而言會產生問題,由於這個系統會共享套接字和時間戳,這會致使內核丟棄SYN包並忽略鏈接意圖。這會致使隨機鏈接錯誤,形成如公司或大學的NAT使用人員隨機胡亂鏈接,甚至致使擁有許多無線鏈接設備的家庭也出現鏈接故障。ide


因此,從本質上來講,可使用tcp_tw_reuse 來釋放TIME_WAIT中的套接字,可是不要使用tcp_tw_recycle,由於這個設置會給管理員和用戶帶來無數問題。固然,對於大型站點而言,還有其它須要關注的關鍵內核設置,最重要的設置包括iptables conntrack 設置和TCP 內存設置。blog


( Authored by Steve Mushero | ChinaNetCloud CEO & CTO 本博客英文原文請點擊查看ip

相關文章
相關標籤/搜索