本文介紹常見的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/目錄查看和修改核心參數
登入Linux系統的ECS執行個體。
具體操作,請參見串連方式概述。
使用
cat
命令,可以查看對應檔案的內容。例如,執行以下命令,查看
net.ipv4.tcp_tw_recycle
的值。cat /proc/sys/net/ipv4/tcp_tw_recycle
使用
echo
命令,可以修改核心參數對應的檔案。例如,執行以下命令,將
net.ipv4.tcp_tw_recycle
的值修改為0。echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle
通過/etc/sysctl.conf檔案查看和修改核心參數
登入Linux系統的ECS執行個體。
具體操作,請參見串連方式概述。
執行如下命令,查看當前系統中生效的所有參數。
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
修改核心參數。
臨時修改。
/sbin/sysctl -w kernel.parameter="[$Example]"
說明kernel.parameter請替換成核心名,[$Example]請替換成參數值,如執行
sysctl -w net.ipv4.tcp_tw_recycle="0"
命令,將net.ipv4.tcp_tw_recycle
核心參數值改為0。永久修改。
執行如下命令,開啟
/etc/sysctl.conf
設定檔。vim /etc/sysctl.conf
按
i
鍵進入編輯模式。根據需要,修改核心參數。
具體格式如下所示。
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
按
Esc
鍵,輸入:wq
,儲存並退出編輯。執行如下命令,使配置生效。
/sbin/sysctl -p
網路相關核心參數常見問題及解決方案
無法遠端連線Linux系統的ECS執行個體,在/var/log/message日誌看到“nf_conntrack: table full, dropping packet”錯誤資訊怎麼辦?
為什麼/var/log/messages日誌中會出現“Time wait bucket table overflow”錯誤資訊?
無法遠端連線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_buckets
、nf_conntrack_max
參數相關,後者的預設值是前者的4倍,所以一般建議調大nf_conntrack_max
參數值。
維護系統串連比較消耗記憶體,建議您在系統空閑和記憶體充足的情況下,將nf_conntrack_max
參數值調大。
解決方案
使用VNC遠端連線執行個體。
具體操作,請參見通過密碼認證登入Linux執行個體。
修改
nf_conntrack_max
參數值。執行以下命令,開啟
/etc/sysctl.conf
檔案。vi /etc/sysctl.conf
按
i
鍵進入編輯模式。修改
nf_conntrack_max
參數值。例如,將雜湊表項最大值參數修改為
655350
。net.netfilter.nf_conntrack_max = 655350
按
Esc
鍵,輸入:wq
,儲存並退出編輯。
修改逾時參數
nf_conntrack_tcp_timeout_established
值。例如,修改逾時參數值為1200,預設逾時時間是432000秒。
net.netfilter.nf_conntrack_tcp_timeout_established = 1200
執行如下命令,使配置生效。
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
參數值。
使用VNC遠端連線執行個體。
具體操作,請參見通過密碼認證登入Linux執行個體。
執行以下命令,查看TCP串連數。
netstat -antp | awk 'NR>2 {print $6}' | sort | uniq -c
顯示如下,表示處於TIME_WAIT狀態的串連數為6300。
6300 TIME_WAIT 40 LISTEN 20 ESTABLISHED 20 CONNECTED
執行如下命令,查看
net.ipv4.tcp_max_tw_buckets
參數值。cat /etc/sysctl.conf | grep net.ipv4.tcp_max_tw_buckets
顯示如下所示,表示
net.ipv4.tcp_max_tw_buckets
參數值為20000。修改
net.ipv4.tcp_max_tw_buckets
參數值。執行以下命令,開啟
/etc/sysctl.conf
檔案。vi /etc/sysctl.conf
按
i
鍵進入編輯模式。修改
net.ipv4.tcp_max_tw_buckets
參數值。例如,將
net.ipv4.tcp_max_tw_buckets
參數值修改為65535
。net.ipv4.tcp_max_tw_buckets = 65535
按
Esc
鍵,輸入:wq
,儲存並退出編輯。
執行如下命令,使配置生效。
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串連。
使用VNC遠端連線執行個體。
具體操作,請參見通過密碼認證登入Linux執行個體。
修改
net.ipv4.tcp_fin_timeout
參數值。執行以下命令,開啟
/etc/sysctl.conf
檔案。vi /etc/sysctl.conf
按
i
鍵進入編輯模式。修改
net.ipv4.tcp_fin_timeout
參數值。例如,將
net.ipv4.tcp_fin_timeout
參數值修改為10。net.ipv4.tcp_fin_timeout = 10
按
Esc
鍵,輸入:wq
,儲存並退出編輯。
執行如下命令,使配置生效。
sysctl -p
為什麼Linux系統的ECS執行個體中,出現大量的處於CLOSE_WAIT狀態的TCP串連?
問題現象
Linux系統的ECS執行個體中,出現大量的處於CLOSE_WAIT狀態的TCP串連。
問題原因
出現該問題的可能原因是CLOSE_WAIT數量超出了正常的範圍。
TCP串連斷開時需要進行四次揮手,TCP串連的兩端都可以發起關閉串連的請求,若對端發起了關閉串連,但本地沒有關閉串連,那麼該串連就會處於CLOSE_WAIT狀態。雖然該串連已經處於半串連狀態,但是已經無法和對端通訊,需要及時地釋放該串連。
解決方案
建議您從業務層面及時判斷某個串連是否已經被對端關閉,即在程式邏輯中對串連及時關閉,並進行檢查。
遠端連線ECS執行個體。
具體操作,請參見串連方式概述。
在程式中檢查並關閉CLOSE_WAIT狀態的TCP串連。
程式設計語言中對應的讀、寫函數一般包含了檢測CLOSE_WAIT狀態的TCP串連功能。Java語言和C語言中關閉串連的方法如下:
Java語言
通過
read
方法來判斷I/O 。當read方法返回-1
時,則表示已經到達末尾。通過
close
方法關閉該串連。
C語言
檢查
read
的傳回值。若等於0,則可以關閉該串連。
若小於0,則查看error,若不是AGAIN,則同樣可以關閉串連。
為什麼用戶端配置NAT後,無法訪問服務端的ECS或RDS?
問題現象
用戶端配置NAT後無法訪問服務端的ECS、RDS,包括配置了SNAT的VPC中的ECS執行個體。
問題原因
出現該問題可能是服務端的net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_timestamps
參數值配置為1導致。
當服務端的核心參數net.ipv4.tcp_tw_recycle
和net.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。
使用VNC遠端連線執行個體。
具體操作,請參見通過密碼認證登入Linux執行個體。
修改
net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_timestamps
參數值為0。執行以下命令,開啟
/etc/sysctl.conf
檔案。vi /etc/sysctl.conf
按
i
鍵進入編輯模式。將
net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_timestamps
參數值修改為0。net.ipv4.tcp_tw_recycle=0 net.ipv4.tcp_timestamps=0
按
Esc
鍵,輸入:wq
,儲存並退出編輯。
執行以下命令,使配置生效。
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.core.optmem_max | 表示每個通訊端所允許的最大緩衝區的大小。 |
net.ipv4.tcp_mem | 確定TCP棧應該如何反映記憶體使用量,每個值的單位都是記憶體頁(通常是4 KB)。
|
net.ipv4.tcp_rmem | 為自動調優定義Socket使用的記憶體。
|
net.ipv4.tcp_wmem | 為自動調優定義Socket使用的記憶體。
|
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同步標籤(
|
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 | 該參數決定了系統中處於
|
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 | 雜湊表項最大值。 |