全部產品
Search
文件中心

:Linux系統常用核心網路參數介紹與常見問題處理

更新時間:Jul 04, 2024

本文介紹常見的Linux系統核心網路參數及常見問題的解決方案。

注意事項

在修改核心參數前,您需要注意以下幾點:

  • 從實際需求出發,盡量有相關資料的支撐,不建議您隨意調整核心參數。

  • 瞭解參數的具體作用,需注意不同類型或版本的環境中,核心參數可能有所不同。

  • 備份ECS執行個體中的重要資料,具體操作,請參見建立快照

查看和修改核心參數

/proc/sys//etc/sysctl.conf都支援在執行個體運行時修改核心參數,不同之處如下:

  • /proc/sys/是一個虛擬檔案系統,提供了訪問核心參數的方法,該目錄下的net中存放了當前系統中已開啟的所有網路核心參數,可以在系統運行時進行修改,但重啟執行個體後就會失效,一般用於臨時性驗證修改的效果。

  • /etc/sysctl.conf是一個設定檔,您可以通過修改/etc/sysctl.conf檔案來修改核心參數的預設值,執行個體重啟後不會失效

/proc/sys/目錄下檔案與/etc/sysctl.conf設定檔中參數的完整名稱相關,如net.ipv4.tcp_tw_recycle參數,對應的檔案是/proc/sys/net/ipv4/tcp_tw_recycle檔案,檔案的內容就是參數值。

說明

Linux從4.12核心版本開始移除了tcp_tw_recycle配置,即移除sysctl.conf中關於net.ipv4.tcp_tw_recycle的配置內容,當您的系統核心低於4.12版本才可以使用net.ipv4.tcp_tw_recycle參數。

通過/proc/sys/目錄查看和修改核心參數

  1. 登入Linux系統的ECS執行個體。

    具體操作,請參見串連方式概述

  2. 使用cat命令,可以查看對應檔案的內容。

    例如,執行以下命令,查看net.ipv4.tcp_tw_recycle的值。

    cat /proc/sys/net/ipv4/tcp_tw_recycle 
  3. 使用echo命令,可以修改核心參數對應的檔案。

    例如,執行以下命令,將net.ipv4.tcp_tw_recycle的值修改為0。

    echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle 

通過/etc/sysctl.conf檔案查看和修改核心參數

  1. 登入Linux系統的ECS執行個體。

    具體操作,請參見串連方式概述

  2. 執行如下命令,查看當前系統中生效的所有參數。

    sysctl -a

    部分核心參數顯示如下所示。

    net.ipv4.tcp_app_win = 31
    net.ipv4.tcp_adv_win_scale = 2
    net.ipv4.tcp_tw_reuse = 0
    net.ipv4.tcp_frto = 2
    net.ipv4.tcp_frto_response = 0
    net.ipv4.tcp_low_latency = 0
    net.ipv4.tcp_no_metrics_save = 0
    net.ipv4.tcp_moderate_rcvbuf = 1
    net.ipv4.tcp_tso_win_divisor = 3
    net.ipv4.tcp_congestion_control = cubic
    net.ipv4.tcp_abc = 0
    net.ipv4.tcp_mtu_probing = 0
    net.ipv4.tcp_base_mss = 512
    net.ipv4.tcp_workaround_signed_windows = 0
    net.ipv4.tcp_challenge_ack_limit = 1000
    net.ipv4.tcp_limit_output_bytes = 262144
    net.ipv4.tcp_dma_copybreak = 4096
    net.ipv4.tcp_slow_start_after_idle = 1
    net.ipv4.cipso_cache_enable = 1
    net.ipv4.cipso_cache_bucket_size = 10
    net.ipv4.cipso_rbm_optfmt = 0
    net.ipv4.cipso_rbm_strictvalid = 1
  3. 修改核心參數。

    • 臨時修改。

      /sbin/sysctl -w kernel.parameter="[$Example]"
      說明

      kernel.parameter請替換成核心名,[$Example]請替換成參數值,如執行sysctl -w net.ipv4.tcp_tw_recycle="0"命令,將net.ipv4.tcp_tw_recycle核心參數值改為0。

    • 永久修改。

      1. 執行如下命令,開啟/etc/sysctl.conf設定檔。

        vim /etc/sysctl.conf
      2. i鍵進入編輯模式。

      3. 根據需要,修改核心參數。

        具體格式如下所示。

        net.ipv6.conf.all.disable_ipv6 = 1
        net.ipv6.conf.default.disable_ipv6 = 1
        net.ipv6.conf.lo.disable_ipv6 = 1
      4. Esc鍵,輸入:wq,儲存並退出編輯。

      5. 執行如下命令,使配置生效。

        /sbin/sysctl -p

網路相關核心參數常見問題及解決方案

無法遠端連線Linux系統的ECS執行個體,在/var/log/message日誌看到“nf_conntrack: table full, dropping packet”錯誤資訊怎麼辦?

問題現象

無法遠端連線ECS執行個體,ping目標執行個體時出現ping丟包或ping不通情況,在/var/log/message系統日誌中頻繁出現以下錯誤資訊。

Feb  6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb  6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb  6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb  6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.

問題原因

ip_conntrack是Linux系統內NAT的一個跟蹤串連條目的模組,ip_conntrack模組會使用一個雜湊表記錄TCP協議established connection記錄。當這個雜湊表滿之後,新串連的資料包會被丟棄掉,就會出現nf_conntrack: table full, dropping packet錯誤。

Linux系統會開闢一個空間,用於維護每一個TCP連結,這個空間的大小與nf_conntrack_bucketsnf_conntrack_max參數相關,後者的預設值是前者的4倍,所以一般建議調大nf_conntrack_max參數值。

說明

維護系統串連比較消耗記憶體,建議您在系統空閑和記憶體充足的情況下,將nf_conntrack_max參數值調大。

解決方案

  1. 使用VNC遠端連線執行個體。

    具體操作,請參見通過密碼認證登入Linux執行個體

  2. 修改nf_conntrack_max參數值。

    1. 執行以下命令,開啟/etc/sysctl.conf檔案。

      vi /etc/sysctl.conf
    2. i鍵進入編輯模式。

    3. 修改nf_conntrack_max參數值。

      例如,將雜湊表項最大值參數修改為655350

      net.netfilter.nf_conntrack_max = 655350
    4. Esc鍵,輸入:wq,儲存並退出編輯。

  3. 修改逾時參數nf_conntrack_tcp_timeout_established值。

    例如,修改逾時參數值為1200,預設逾時時間是432000秒。

    net.netfilter.nf_conntrack_tcp_timeout_established = 1200
  4. 執行如下命令,使配置生效。

    sysctl -p

為什麼/var/log/messages日誌中會出現“Time wait bucket table overflow”錯誤資訊?

問題現象

Linux系統的ECS執行個體中,/var/log/messages日誌中頻繁出現“kernel: TCP: time wait bucket table overflow”錯誤資訊。

Feb 18 12:28:38 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:44 i-*** kernel: printk: 227 messages suppressed.
Feb 18 12:28:44 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:52 i-*** kernel: printk: 121 messages suppressed.
Feb 18 12:28:52 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:53 i-*** kernel: printk: 351 messages suppressed.
Feb 18 12:28:53 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:59 i-*** kernel: printk: 319 messages suppressed.

問題原因

net.ipv4.tcp_max_tw_buckets參數用於調整核心中管理TIME_WAIT狀態的數量,當ECS執行個體中處於TIME_WAIT狀態的串連數,加上需要轉換為TIME_WAIT狀態的串連數之和超過net.ipv4.tcp_max_tw_buckets參數值時,/var/log/messages日誌中就會出現“kernel: TCP: time wait bucket table overflow”錯誤資訊,此時,系統核心將會關閉超出參數值的部分TCP串連。

解決方案

您可以根據實際情況適當調高net.ipv4.tcp_max_tw_buckets參數值,同時,建議您從業務層面去改進TCP串連。本文介紹如何修改net.ipv4.tcp_max_tw_buckets參數值。

  1. 使用VNC遠端連線執行個體。

    具體操作,請參見通過密碼認證登入Linux執行個體

  2. 執行以下命令,查看TCP串連數。

    netstat -antp | awk 'NR>2 {print $6}' | sort | uniq -c

    顯示如下,表示處於TIME_WAIT狀態的串連數為6300。

    6300 TIME_WAIT
     40 LISTEN
     20 ESTABLISHED
     20 CONNECTED
  3. 執行如下命令,查看net.ipv4.tcp_max_tw_buckets參數值。

    cat /etc/sysctl.conf | grep net.ipv4.tcp_max_tw_buckets

    顯示如下所示,表示net.ipv4.tcp_max_tw_buckets參數值為20000。

    2023-04-02_11-03-24

  4. 修改net.ipv4.tcp_max_tw_buckets參數值。

    1. 執行以下命令,開啟/etc/sysctl.conf檔案。

      vi /etc/sysctl.conf
    2. i鍵進入編輯模式。

    3. 修改net.ipv4.tcp_max_tw_buckets參數值。

      例如,將net.ipv4.tcp_max_tw_buckets參數值修改為65535

      net.ipv4.tcp_max_tw_buckets = 65535
    4. Esc鍵,輸入:wq,儲存並退出編輯。

  5. 執行如下命令,使配置生效。

    sysctl -p

為什麼Linux系統的ECS執行個體中,出現大量的處於FIN_WAIT2狀態的TCP串連?

問題現象

Linux系統的ECS執行個體中,出現大量的處於FIN_WAIT2狀態的TCP串連。

問題原因

出現該問題可能有以下原因:

  • 在HTTP服務中,Server由於某種原因會主動關閉串連,例如在KEEPALIVE逾時的情況下,主動關閉串連的Server就會進入FIN_WAIT2狀態。

  • 在TCP/IP協議棧中,存在半串連的概念,FIN_WAIT2狀態不算逾時(與TIME_WAIT狀態不同)。如果Client不關閉,FIN_WAIT2狀態將保持到系統重啟,越來越多的FIN_WAIT2狀態會致使核心Crash。

解決方案

您可以將net.ipv4.tcp_fin_timeout參數值調小,以便加快系統關閉處於FIN_WAIT2狀態的TCP串連。

  1. 使用VNC遠端連線執行個體。

    具體操作,請參見通過密碼認證登入Linux執行個體

  2. 修改net.ipv4.tcp_fin_timeout參數值。

    1. 執行以下命令,開啟/etc/sysctl.conf檔案。

      vi /etc/sysctl.conf
    2. i鍵進入編輯模式。

    3. 修改net.ipv4.tcp_fin_timeout參數值。

      例如,將net.ipv4.tcp_fin_timeout參數值修改為10。

      net.ipv4.tcp_fin_timeout = 10
    4. Esc鍵,輸入:wq,儲存並退出編輯。

  3. 執行如下命令,使配置生效。

    sysctl -p

為什麼Linux系統的ECS執行個體中,出現大量的處於CLOSE_WAIT狀態的TCP串連?

問題現象

Linux系統的ECS執行個體中,出現大量的處於CLOSE_WAIT狀態的TCP串連。

問題原因

出現該問題的可能原因是CLOSE_WAIT數量超出了正常的範圍。

TCP串連斷開時需要進行四次揮手,TCP串連的兩端都可以發起關閉串連的請求,若對端發起了關閉串連,但本地沒有關閉串連,那麼該串連就會處於CLOSE_WAIT狀態。雖然該串連已經處於半串連狀態,但是已經無法和對端通訊,需要及時地釋放該串連。

解決方案

建議您從業務層面及時判斷某個串連是否已經被對端關閉,即在程式邏輯中對串連及時關閉,並進行檢查。

  1. 遠端連線ECS執行個體。

    具體操作,請參見串連方式概述

  2. 在程式中檢查並關閉CLOSE_WAIT狀態的TCP串連。

    程式設計語言中對應的讀、寫函數一般包含了檢測CLOSE_WAIT狀態的TCP串連功能。Java語言和C語言中關閉串連的方法如下:

    • Java語言

      1. 通過read方法來判斷I/O 。當read方法返回-1時,則表示已經到達末尾。

      2. 通過close方法關閉該串連。

    • C語言

      檢查read的傳回值。

      • 若等於0,則可以關閉該串連。

      • 若小於0,則查看error,若不是AGAIN,則同樣可以關閉串連。

為什麼用戶端配置NAT後,無法訪問服務端的ECS或RDS?

問題現象

用戶端配置NAT後無法訪問服務端的ECS、RDS,包括配置了SNAT的VPC中的ECS執行個體。

問題原因

出現該問題可能是服務端的net.ipv4.tcp_tw_recyclenet.ipv4.tcp_timestamps參數值配置為1導致。

當服務端的核心參數net.ipv4.tcp_tw_recyclenet.ipv4.tcp_timestamps的值都為1,表示服務端會檢查每一個TCP串連報文中的時間戳記(Timestamp),若Timestamp不是遞增的關係,則不會響應這個報文。

解決方案

您可以根據服務端雲產品不通,選擇合適的方案進行處理。

  • 遠端伺服器為ECS時,修改net.ipv4.tcp_tw_recycle參數和net.ipv4.tcp_timestamps參數為0。

  • 遠端伺服器為RDS時,RDS無法直接修改核心參數,需要在用戶端上修改net.ipv4.tcp_tw_recycle參數和net.ipv4.tcp_timestamps參數為0。

  1. 使用VNC遠端連線執行個體。

    具體操作,請參見通過密碼認證登入Linux執行個體

  2. 修改net.ipv4.tcp_tw_recyclenet.ipv4.tcp_timestamps參數值為0。

    1. 執行以下命令,開啟/etc/sysctl.conf檔案。

      vi /etc/sysctl.conf
    2. i鍵進入編輯模式。

    3. net.ipv4.tcp_tw_recyclenet.ipv4.tcp_timestamps參數值修改為0。

      net.ipv4.tcp_tw_recycle=0
      net.ipv4.tcp_timestamps=0
    4. Esc鍵,輸入:wq,儲存並退出編輯。

  3. 執行以下命令,使配置生效。

    sysctl -p 

常見Linux核心參數說明

參數

說明

net.core.rmem_default

預設的socket資料接收視窗大小(位元組)。

net.core.rmem_max

最大的socket資料接收視窗(位元組)。

net.core.wmem_default

預設的socket資料發送視窗大小(位元組)。

net.core.wmem_max

最大的socket資料發送視窗(位元組)。

net.core.netdev_max_backlog

當核心處理速度比網卡接收速度慢時,這部分多出來的包就會被儲存在網卡的接收隊列上。

該參數說明了這個隊列的數量上限,在每個網路介面接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數目。

net.core.somaxconn

該參數定義了系統中每一個連接埠最大的監聽隊列的長度,是個全域參數。

該參數和net.ipv4.tcp_max_syn_backlog有關聯,後者指的是還在三向交握的半串連的上限,該參數指的是處於ESTABLISHED的數量上限。若您的執行個體業務負載很高,則有必要調高該參數。listen(2)函數中的參數backlog 同樣是指明監聽的連接埠處於ESTABLISHED的數量上限,當backlog大於net.core.somaxconn時,以net.core.somaxconn參數為準。

net.core.optmem_max

表示每個通訊端所允許的最大緩衝區的大小。

net.ipv4.tcp_mem

確定TCP棧應該如何反映記憶體使用量,每個值的單位都是記憶體頁(通常是4 KB)。

  • 第一個值是記憶體使用量的下限。

  • 第二個值是記憶體壓力模式開始對緩衝區使用應用壓力的上限。

  • 第三個值是記憶體使用量的上限。在這個層次上可以將報文丟棄,從而減少對記憶體的使用。對於較大的BDP可以增大這些值(其單位是記憶體頁而不是位元組)。

net.ipv4.tcp_rmem

為自動調優定義Socket使用的記憶體。

  • 第一個值是為Socket接收緩衝區分配的最少位元組數。

  • 第二個值是預設值(該值會覆蓋rmem_default),緩衝區在系統負載不重的情況下可以增長到這個值。

  • 第三個值是接收緩衝區空間的最大位元組數(該值會覆蓋rmem_max)。

net.ipv4.tcp_wmem

為自動調優定義Socket使用的記憶體。

  • 第一個值是為Socket發送緩衝區分配的最少位元組數。

  • 第二個值是預設值(該值會覆蓋wmem_default),緩衝區在系統負載不重的情況下可以增長到這個值。

  • 第三個值是發送緩衝區空間的最大位元組數(該值不會覆蓋wmem_max)。

net.ipv4.tcp_keepalive_time

TCP發送keepalive探測訊息的間隔時間(秒),用於確認TCP串連是否有效。

net.ipv4.tcp_keepalive_intvl

探測訊息未獲得響應時,重發該訊息的間隔時間(秒)。

net.ipv4.tcp_keepalive_probes

在認定TCP串連失效之前,最多發送多少個keepalive探測訊息。

net.ipv4.tcp_sack

啟用有選擇的應答(1表示啟用),通過有選擇地應答亂序接收到的報文來提高效能,讓寄件者只發送丟失的報文段,(對於廣域網路通訊來說)這個選項應該啟用,但是會增加對CPU的佔用。

net.ipv4.tcp_timestamps

TCP時間戳記(會在TCP包頭增加12B),以一種比重發逾時更精確的方法(參考RFC 1323)來啟用對RTT的計算,為實現更好的效能應該啟用這個選項。

net.ipv4.tcp_window_scaling

啟用RFC 1323(參考RFC 1323)定義的window scaling,若要支援超過64 KB的TCP視窗,必須啟用該值(1表示啟用),TCP視窗最大至1 GB,TCP串連雙方都啟用時才生效。

net.ipv4.tcp_syncookies

該參數表示是否開啟TCP同步標籤(SYN_COOKIES),核心必須開啟並編譯CONFIG_SYN_COOKIES,SYN_COOKIES可以防止一個通訊端在有過多試圖串連到達時,引起過載。

  • 預設值0表示關閉。

  • 當該參數被設定為1,且SYN_RECV隊列滿了之後,核心會對SYN包的回複做一定的修改,即在響應的SYN+ACK包中,初始的序號是由源IP+Port、目的IP+Port及時間這五個參數共同計算出一個值組成精心組裝的TCP包。由於ACK包中確認的序號並不是之前計算出的值,惡意攻擊者無法響應或誤判,而要求者會根據收到的SYN+ACK包做正確的響應。啟用net.ipv4.tcp_syncookies後,會忽略net.ipv4.tcp_max_syn_backlog

net.ipv4.tcp_tw_reuse

表示是否允許將處於TIME-WAIT狀態的Socket(TIME-WAIT的連接埠)用於新的TCP串連。

net.ipv4.tcp_tw_recycle

能夠更快地回收TIME-WAIT通訊端。

net.ipv4.tcp_fin_timeout

對於本端斷開的Socket串連,TCP保持在FIN-WAIT-2狀態的時間(秒)。對端可能會中斷連線或一直不結束串連或不可預料的進程死亡。

net.ipv4.ip_local_port_range

表示TCP/UDP協議允許使用的本地連接埠號碼。

net.ipv4.tcp_max_syn_backlog

該參數決定了系統中處於SYN_RECV狀態的TCP串連數量。

SYN_RECV狀態指的是當系統收到SYN後,作為SYN+ACK響應後等待對方回複三向交握階段中的最後一個ACK的階段。對於還未獲得對方確認的串連請求,可儲存在隊列中的最大數目。如果伺服器經常出現過載,可以嘗試增加這個數字。預設值大小會受執行個體記憶體的影響,預設值最大為2048。

net.ipv4.tcp_westwood

啟用寄件者端的擁塞控制演算法,它可以維護對輸送量的評估,並試圖對頻寬的整體利用情況進行最佳化,對於WAN通訊來說應該啟用這個選項。

net.ipv4.tcp_bic

為快速長距離網路啟用Binary Increase Congestion,這樣可以更好地利用以GB速度進行操作的連結,對於WAN通訊應該啟用這個選項。

net.ipv4.tcp_max_tw_buckets

該參數設定系統的TIME_WAIT的數量,如果超過預設值則會被立即清除。tcp_max_tw_buckets預設值大小會受執行個體記憶體的影響,最大值為262144。

net.ipv4.tcp_synack_retries

指明了處於SYN_RECV狀態時重傳SYN+ACK包的次數。

net.ipv4.tcp_abort_on_overflow

設定該參數為1時,當系統在短時間內收到了大量的請求,而相關的應用程式未能處理時,就會發送Reset包直接終止這些連結。建議通過最佳化應用程式的效率來提高處理能力,而不是簡單地Reset。預設值為0。

net.ipv4.route.max_size

核心所允許的最大路由數目。

net.ipv4.ip_forward

介面間轉寄報文。

net.ipv4.ip_default_ttl

報文可以經過的最大跳數。

net.netfilter.nf_conntrack_tcp_timeout_established

在指定時間內,已經建立的串連如果沒有活動,則通過iptables進行清除。

net.netfilter.nf_conntrack_max

雜湊表項最大值。

相關文檔