天天看點

Linux系統TCP核心參數優化總結1. 建立連接配接階段2. 資料傳輸階段3. 斷開連接配接階段

Linux系統TCP核心參數優化總結1. 建立連接配接階段2. 資料傳輸階段3. 斷開連接配接階段

日常運維工作中,會遇到很多TCP相關的問題,網上有很多文章介紹需要優化哪些TCP核心參數,但是并沒有很詳細說明優化的依據、适用的場景是什麼,如果我們不了解各個參數實際的作用,照搬網上的配置到生産環境,很有可能會适得其反,本文從建立連接配接、資料傳輸、斷開連接配接三個階段對涉及到的相關TCP核心參數做出說明并給出優化建議。

Linux系統TCP核心參數優化總結1. 建立連接配接階段2. 資料傳輸階段3. 斷開連接配接階段

圖1:TCP連接配接狀态變遷圖

1. 建立連接配接階段

  • net.ipv4.tcp_syn_retries

    控制三次握手第一步用戶端發送syn得不到服務端響應時重傳syn的次數,如果是内網環境,中間鍊路少,網絡穩定,服務端無響應很可能是服務端應用出了問題,重傳多次的意義不大,還會加大服務端壓力,可以調低重傳次數,讓用戶端盡快去嘗試連接配接其他服務端。

  • net.ipv4.tcp_syncookies

    開啟SYN Cookies,預設開啟,建議保持預設值,可以提升SYN Flood攻擊的防護能力。

  • net.ipv4.tcp_synack_retries

    控制三次握手第二步服務端發送syn+ack得不到用戶端響應時重傳syn+ack的次數,如果是内網環境,中間鍊路少,網絡穩定,用戶端無響應很可能是用戶端出了問題,重傳多次的意義不大,可以調低重傳次數。

  • net.ipv4.tcp_max_syn_backlog

    控制半連接配接隊列大小,所謂半連接配接是指還沒有完成TCP三向交握的連接配接。服務端收到了用戶端的SYN包後,就會把這個連接配接放到半連接配接隊列中,然後再向用戶端發送SYN+ACK,為了應對建立連接配接數暴增的場景,建議調大,半連接配接隊列溢出觀察方法:netstat -s | grep "SYNs to LISTEN"

  • net.core.somaxconn

    全連接配接隊列=min(somaxconn,backlog),所謂全連接配接,是指服務端已經收到用戶端三次握手第三步的ACK,然後就會把這個連接配接放到全連接配接隊列中,全連接配接隊列中的連接配接還需要被 accept()系統調用取走,服務端應用才可以開始處理用戶端的請求,建議适當調大,全連接配接隊列溢出觀察方法:netstat -s | grep "listen queue"

  • net.ipv4.tcp_abort_on_overflow

    當全連接配接隊列滿了之後,新的連接配接就會被丢棄掉。服務端在丢棄新連接配接時,預設行為是直接丢棄不去通知用戶端,有的時候需要發送reset來通知用戶端,這樣用戶端就不會再次重試,至于是否需要給用戶端發送reset,是由tcp_abort_on_overflow參數控制,預設為0,即不發送reset給用戶端,如非特殊需求,建議保持預設值。

2. 資料傳輸階段

  • net.ipv4.tcp_wmem

    tcp發送緩沖區大小,包含min、default、max三個值,核心會控制發送緩沖區在min-max之間動态調整,可根據實際業務場景和伺服器配置适當調大,如果設定了socket的SO_SNDBUF,動态調整功能失效,一般不建議設定。

  • net.core.wmem_max

    socket發送緩沖區的最大值,需要設定net.core.wmem_max的值大于等于 net.ipv4.tcp_wmem的max值。

  • net.ipv4.tcp_mem

    系統中所有tcp連接配接最多可消耗的記憶體,有三個值,當TCP總記憶體小于第1個值時,不需要核心進行自動調節,在第1和第2個值之間時,核心開始調節緩沖區的大小,大于第3個值時,核心不再為TCP配置設定新記憶體,此時無法建立連接配接,需要注意的是,三個值的機關都是記憶體頁,也就是4KB。

  • net.ipv4.tcp_rmem

    tcp接收緩沖區大小,包含min、default、max三個值,核心會控制接收緩沖區在min-max之間動态調整,可根據實際業務場景和伺服器配置适當調大,如果設定了socket的 SO_RECVBUF或者關閉了net.ipv4.tcp_moderate_rcvbuf,動态調整功能失效。

  • net.core.rmem_max

    socket接收緩沖區的最大值,需要設定net.core.rmem_max的值大于等于net.ipv4.tcp_rmem 的max值。

  • net.ipv4.tcp_moderate_rcvbuf

    接收緩沖區動态調整功能,預設打開,建議保持預設配置。

  • net.ipv4.tcp_window_scaling

    擴充滑動視窗,tcp頭部中,視窗字段隻有2個位元組,最多隻能達到2的16次方,即65535位元組大小的視窗,打開此開關可以擴充視窗大小,預設打開,建議保持預設配置。

  • net.ipv4.tcp_keepalive_probes

    keepalive探測失敗後通知應用前的重試次數,建議适當調低。

  • net.ipv4.tcp_keepalive_intvl

    keepalive探測包的發送間隔時間,建議适當調低。

  • net.ipv4.tcp_keepalive_time

    最後一次資料包到keepalive探測包的間隔時間,建議适當調低。

  • net.ipv4.tcp_available_congestion_control

    檢視核心支援的擁塞控制算法。

  • net.ipv4.tcp_congestion_control

    配置擁塞控制算法,預設cubic,核心4.9版本後支援BBR,弱網絡條件下建議配置成BBR。

3. 斷開連接配接階段

  • net.ipv4.tcp_fin_timeout

    是從Fin_WAIT_2到TIME_WAIT的逾時時間,長時間收不到對端FIN包,大機率是對端機器有問題,不能及時調用close()關閉連接配接,建議調低,避免等待時間太長,資源開銷過大。

  • net.ipv4.tcp_max_tw_buckets

    系統TIME_WAIT連接配接的最大數量,根據實際業務需要調整,超過最大值後dmesg會有報錯TCP: time wait bucket table overflow。

  • net.ipv4.tcp_tw_reuse

    允許TIME_WAIT狀态的連接配接占用的端口用到建立連接配接中,用戶端可開啟。

  • net.ipv4.tcp_tw_recycle

    開啟後,TIME_WAIT狀态的連接配接無需等待2MSL時間就可用于建立連接配接,在NAT環境下,開啟tcp_tw_recycle參數會觸發PAWS機制導緻丢包,建議不開啟,事實上,核心在4.1版本後就把這個參數删除了。

我們是阿裡雲智能全球技術服務-SRE團隊,我們緻力成為一個以技術為基礎、面向服務、保障業務系統高可用的工程師團隊;提供專業、體系化的SRE服務,幫助廣大客戶更好地使用雲、基于雲建構更加穩定可靠的業務系統,提升業務穩定性。我們期望能夠分享更多幫助企業客戶上雲、用好雲,讓客戶雲上業務運作更加穩定可靠的技術,您可用釘釘掃描下方二維碼,加入阿裡雲SRE技術學院釘釘圈子,和更多雲上人交流關于雲平台的那些事。

Linux系統TCP核心參數優化總結1. 建立連接配接階段2. 資料傳輸階段3. 斷開連接配接階段