Linux TCP 回收與重用

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


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


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


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


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


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章