Linux系統(tǒng)常用內(nèi)核網(wǎng)絡參數(shù)介紹與常見問題處理
本文介紹常見的Linux系統(tǒng)內(nèi)核網(wǎng)絡參數(shù)及常見問題的解決方案。
注意事項
在修改內(nèi)核參數(shù)前,您需要注意以下幾點:
從實際需求出發(fā),盡量有相關數(shù)據(jù)的支撐,不建議您隨意調(diào)整內(nèi)核參數(shù)。
了解參數(shù)的具體作用,需注意不同類型或版本的環(huán)境中,內(nèi)核參數(shù)可能有所不同。
備份ECS實例中的重要數(shù)據(jù),具體操作,請參見創(chuàng)建快照。
查看和修改內(nèi)核參數(shù)
/proc/sys/
和/etc/sysctl.conf
都支持在實例運行時修改內(nèi)核參數(shù),不同之處如下:
/proc/sys/
是一個虛擬文件系統(tǒng),提供了訪問內(nèi)核參數(shù)的方法,該目錄下的net
中存放了當前系統(tǒng)中已開啟的所有網(wǎng)絡內(nèi)核參數(shù),可以在系統(tǒng)運行時進行修改,但重啟實例后就會失效,一般用于臨時性驗證修改的效果。/etc/sysctl.conf
是一個配置文件,您可以通過修改/etc/sysctl.conf
文件來修改內(nèi)核參數(shù)的默認值,實例重啟后不會失效。
/proc/sys/
目錄下文件與/etc/sysctl.conf
配置文件中參數(shù)的完整名稱相關,如net.ipv4.tcp_tw_recycle
參數(shù),對應的文件是/proc/sys/net/ipv4/tcp_tw_recycle
文件,文件的內(nèi)容就是參數(shù)值。
Linux從4.12內(nèi)核版本開始移除了tcp_tw_recycle配置,即移除sysctl.conf中關于net.ipv4.tcp_tw_recycle的配置內(nèi)容,當您的系統(tǒng)內(nèi)核低于4.12版本才可以使用net.ipv4.tcp_tw_recycle
參數(shù)。
通過/proc/sys/目錄查看和修改內(nèi)核參數(shù)
登錄Linux系統(tǒng)的ECS實例。
具體操作,請參見連接方式概述。
使用
cat
命令,可以查看對應文件的內(nèi)容。例如,執(zhí)行以下命令,查看
net.ipv4.tcp_tw_recycle
的值。cat /proc/sys/net/ipv4/tcp_tw_recycle
使用
echo
命令,可以修改內(nèi)核參數(shù)對應的文件。例如,執(zhí)行以下命令,將
net.ipv4.tcp_tw_recycle
的值修改為0。echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle
通過/etc/sysctl.conf文件查看和修改內(nèi)核參數(shù)
登錄Linux系統(tǒng)的ECS實例。
具體操作,請參見連接方式概述。
執(zhí)行如下命令,查看當前系統(tǒng)中生效的所有參數(shù)。
sysctl -a
部分內(nèi)核參數(shù)顯示如下所示。
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
修改內(nèi)核參數(shù)。
臨時修改。
/sbin/sysctl -w kernel.parameter="[$Example]"
說明kernel.parameter請?zhí)鎿Q成內(nèi)核名,[$Example]請?zhí)鎿Q成參數(shù)值,如執(zhí)行
sysctl -w net.ipv4.tcp_tw_recycle="0"
命令,將net.ipv4.tcp_tw_recycle
內(nèi)核參數(shù)值改為0。永久修改。
執(zhí)行如下命令,打開
/etc/sysctl.conf
配置文件。vim /etc/sysctl.conf
按
i
鍵進入編輯模式。根據(jù)需要,修改內(nèi)核參數(shù)。
具體格式如下所示。
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
按
Esc
鍵,輸入:wq
,保存并退出編輯。執(zhí)行如下命令,使配置生效。
/sbin/sysctl -p
網(wǎng)絡相關內(nèi)核參數(shù)常見問題及解決方案
無法遠程連接Linux系統(tǒng)的ECS實例,在/var/log/message日志看到“nf_conntrack: table full, dropping packet”錯誤信息怎么辦?
為什么/var/log/messages日志中會出現(xiàn)“Time wait bucket table overflow”錯誤信息?
為什么Linux系統(tǒng)的ECS實例中,出現(xiàn)大量的處于FIN_WAIT2狀態(tài)的TCP連接?
為什么Linux系統(tǒng)的ECS實例中,出現(xiàn)大量的處于CLOSE_WAIT狀態(tài)的TCP連接?
無法遠程連接Linux系統(tǒng)的ECS實例,在/var/log/message
日志看到“nf_conntrack: table full, dropping packet”錯誤信息怎么辦?
問題現(xiàn)象
無法遠程連接ECS實例,ping目標實例時出現(xiàn)ping丟包或ping不通情況,在/var/log/message
系統(tǒng)日志中頻繁出現(xiàn)以下錯誤信息。
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系統(tǒng)內(nèi)NAT的一個跟蹤連接條目的模塊,ip_conntrack模塊會使用一個哈希表記錄TCP協(xié)議established connection
記錄。當這個哈希表滿之后,新連接的數(shù)據(jù)包會被丟棄掉,就會出現(xiàn)nf_conntrack: table full, dropping packet
錯誤。
Linux系統(tǒng)會開辟一個空間,用于維護每一個TCP鏈接,這個空間的大小與nf_conntrack_buckets
、nf_conntrack_max
參數(shù)相關,后者的默認值是前者的4倍,所以一般建議調(diào)大nf_conntrack_max
參數(shù)值。
維護系統(tǒng)連接比較消耗內(nèi)存,建議您在系統(tǒng)空閑和內(nèi)存充足的情況下,將nf_conntrack_max
參數(shù)值調(diào)大。
解決方案
使用VNC遠程連接實例。
具體操作,請參見通過密碼認證登錄Linux實例。
修改
nf_conntrack_max
參數(shù)值。執(zhí)行以下命令,打開
/etc/sysctl.conf
文件。vi /etc/sysctl.conf
按
i
鍵進入編輯模式。修改
nf_conntrack_max
參數(shù)值。例如,將哈希表項最大值參數(shù)修改為
655350
。net.netfilter.nf_conntrack_max = 655350
按
Esc
鍵,輸入:wq
,保存并退出編輯。
修改超時參數(shù)
nf_conntrack_tcp_timeout_established
值。例如,修改超時參數(shù)值為1200,默認超時時間是432000秒。
net.netfilter.nf_conntrack_tcp_timeout_established = 1200
執(zhí)行如下命令,使配置生效。
sysctl -p
為什么/var/log/messages
日志中會出現(xiàn)“Time wait bucket table overflow”錯誤信息?
問題現(xiàn)象
Linux系統(tǒng)的ECS實例中,/var/log/messages
日志中頻繁出現(xiàn)“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
參數(shù)用于調(diào)整內(nèi)核中管理TIME_WAIT狀態(tài)的數(shù)量,當ECS實例中處于TIME_WAIT狀態(tài)的連接數(shù),加上需要轉換為TIME_WAIT狀態(tài)的連接數(shù)之和超過net.ipv4.tcp_max_tw_buckets
參數(shù)值時,/var/log/messages
日志中就會出現(xiàn)“kernel: TCP: time wait bucket table overflow”錯誤信息,此時,系統(tǒng)內(nèi)核將會關閉超出參數(shù)值的部分TCP連接。
解決方案
您可以根據(jù)實際情況適當調(diào)高net.ipv4.tcp_max_tw_buckets
參數(shù)值,同時,建議您從業(yè)務層面去改進TCP連接。本文介紹如何修改net.ipv4.tcp_max_tw_buckets
參數(shù)值。
使用VNC遠程連接實例。
具體操作,請參見通過密碼認證登錄Linux實例。
執(zhí)行以下命令,查看TCP連接數(shù)。
netstat -antp | awk 'NR>2 {print $6}' | sort | uniq -c
顯示如下,表示處于TIME_WAIT狀態(tài)的連接數(shù)為6300。
6300 TIME_WAIT 40 LISTEN 20 ESTABLISHED 20 CONNECTED
執(zhí)行如下命令,查看
net.ipv4.tcp_max_tw_buckets
參數(shù)值。cat /etc/sysctl.conf | grep net.ipv4.tcp_max_tw_buckets
顯示如下所示,表示
net.ipv4.tcp_max_tw_buckets
參數(shù)值為20000。修改
net.ipv4.tcp_max_tw_buckets
參數(shù)值。執(zhí)行以下命令,打開
/etc/sysctl.conf
文件。vi /etc/sysctl.conf
按
i
鍵進入編輯模式。修改
net.ipv4.tcp_max_tw_buckets
參數(shù)值。例如,將
net.ipv4.tcp_max_tw_buckets
參數(shù)值修改為65535
。net.ipv4.tcp_max_tw_buckets = 65535
按
Esc
鍵,輸入:wq
,保存并退出編輯。
執(zhí)行如下命令,使配置生效。
sysctl -p
為什么Linux系統(tǒng)的ECS實例中,出現(xiàn)大量的處于FIN_WAIT2狀態(tài)的TCP連接?
問題現(xiàn)象
Linux系統(tǒng)的ECS實例中,出現(xiàn)大量的處于FIN_WAIT2狀態(tài)的TCP連接。
問題原因
出現(xiàn)該問題可能有以下原因:
在HTTP服務中,Server由于某種原因會主動關閉連接,例如在KEEPALIVE超時的情況下,主動關閉連接的Server就會進入FIN_WAIT2狀態(tài)。
在TCP/IP協(xié)議棧中,存在半連接的概念,F(xiàn)IN_WAIT2狀態(tài)不算超時(與TIME_WAIT狀態(tài)不同)。如果Client不關閉,F(xiàn)IN_WAIT2狀態(tài)將保持到系統(tǒng)重啟,越來越多的FIN_WAIT2狀態(tài)會致使內(nèi)核Crash。
解決方案
您可以將net.ipv4.tcp_fin_timeout
參數(shù)值調(diào)小,以便加快系統(tǒng)關閉處于FIN_WAIT2
狀態(tài)的TCP連接。
使用VNC遠程連接實例。
具體操作,請參見通過密碼認證登錄Linux實例。
修改
net.ipv4.tcp_fin_timeout
參數(shù)值。執(zhí)行以下命令,打開
/etc/sysctl.conf
文件。vi /etc/sysctl.conf
按
i
鍵進入編輯模式。修改
net.ipv4.tcp_fin_timeout
參數(shù)值。例如,將
net.ipv4.tcp_fin_timeout
參數(shù)值修改為10。net.ipv4.tcp_fin_timeout = 10
按
Esc
鍵,輸入:wq
,保存并退出編輯。
執(zhí)行如下命令,使配置生效。
sysctl -p
為什么Linux系統(tǒng)的ECS實例中,出現(xiàn)大量的處于CLOSE_WAIT狀態(tài)的TCP連接?
問題現(xiàn)象
Linux系統(tǒng)的ECS實例中,出現(xiàn)大量的處于CLOSE_WAIT狀態(tài)的TCP連接。
問題原因
出現(xiàn)該問題的可能原因是CLOSE_WAIT數(shù)量超出了正常的范圍。
TCP連接斷開時需要進行四次揮手,TCP連接的兩端都可以發(fā)起關閉連接的請求,若對端發(fā)起了關閉連接,但本地沒有關閉連接,那么該連接就會處于CLOSE_WAIT狀態(tài)。雖然該連接已經(jīng)處于半連接狀態(tài),但是已經(jīng)無法和對端通信,需要及時地釋放該連接。
解決方案
建議您從業(yè)務層面及時判斷某個連接是否已經(jīng)被對端關閉,即在程序邏輯中對連接及時關閉,并進行檢查。
遠程連接ECS實例。
具體操作,請參見連接方式概述。
在程序中檢查并關閉CLOSE_WAIT狀態(tài)的TCP連接。
編程語言中對應的讀、寫函數(shù)一般包含了檢測CLOSE_WAIT狀態(tài)的TCP連接功能。Java語言和C語言中關閉連接的方法如下:
Java語言
通過
read
方法來判斷I/O 。當read方法返回-1
時,則表示已經(jīng)到達末尾。通過
close
方法關閉該連接。
C語言
檢查
read
的返回值。若等于0,則可以關閉該連接。
若小于0,則查看error,若不是AGAIN,則同樣可以關閉連接。
為什么客戶端配置NAT后,無法訪問服務端的ECS或RDS?
問題現(xiàn)象
客戶端配置NAT后無法訪問服務端的ECS、RDS,包括配置了SNAT的VPC中的ECS實例。
問題原因
出現(xiàn)該問題可能是服務端的net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_timestamps
參數(shù)值配置為1導致。
當服務端的內(nèi)核參數(shù)net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_timestamps
的值都為1,表示服務端會檢查每一個TCP連接報文中的時間戳(Timestamp),若Timestamp不是遞增的關系,則不會響應這個報文。
解決方案
您可以根據(jù)服務端云產(chǎn)品不通,選擇合適的方案進行處理。
遠端服務器為ECS時,修改
net.ipv4.tcp_tw_recycle
參數(shù)和net.ipv4.tcp_timestamps
參數(shù)為0。遠端服務器為RDS時,RDS無法直接修改內(nèi)核參數(shù),需要在客戶端上修改
net.ipv4.tcp_tw_recycle
參數(shù)和net.ipv4.tcp_timestamps
參數(shù)為0。
使用VNC遠程連接實例。
具體操作,請參見通過密碼認證登錄Linux實例。
修改
net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_timestamps
參數(shù)值為0。執(zhí)行以下命令,打開
/etc/sysctl.conf
文件。vi /etc/sysctl.conf
按
i
鍵進入編輯模式。將
net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_timestamps
參數(shù)值修改為0。net.ipv4.tcp_tw_recycle=0 net.ipv4.tcp_timestamps=0
按
Esc
鍵,輸入:wq
,保存并退出編輯。
執(zhí)行以下命令,使配置生效。
sysctl -p
常見Linux內(nèi)核參數(shù)說明
參數(shù) | 說明 |
net.core.rmem_default | 默認的socket數(shù)據(jù)接收窗口大小(字節(jié))。 |
net.core.rmem_max | 最大的socket數(shù)據(jù)接收窗口(字節(jié))。 |
net.core.wmem_default | 默認的socket數(shù)據(jù)發(fā)送窗口大小(字節(jié))。 |
net.core.wmem_max | 最大的socket數(shù)據(jù)發(fā)送窗口(字節(jié))。 |
net.core.netdev_max_backlog | 當內(nèi)核處理速度比網(wǎng)卡接收速度慢時,這部分多出來的包就會被保存在網(wǎng)卡的接收隊列上。 該參數(shù)說明了這個隊列的數(shù)量上限,在每個網(wǎng)絡接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時,允許送到隊列的數(shù)據(jù)包的最大數(shù)目。 |
net.core.somaxconn | 該參數(shù)定義了系統(tǒng)中每一個端口最大的監(jiān)聽隊列的長度,是個全局參數(shù)。 該參數(shù)和 |
net.core.optmem_max | 表示每個套接字所允許的最大緩沖區(qū)的大小。 |
net.ipv4.tcp_mem | 確定TCP棧應該如何反映內(nèi)存使用,每個值的單位都是內(nèi)存頁(通常是4 KB)。
|
net.ipv4.tcp_rmem | 為自動調(diào)優(yōu)定義Socket使用的內(nèi)存。
|
net.ipv4.tcp_wmem | 為自動調(diào)優(yōu)定義Socket使用的內(nèi)存。
|
net.ipv4.tcp_keepalive_time | TCP發(fā)送keepalive探測消息的間隔時間(秒),用于確認TCP連接是否有效。 |
net.ipv4.tcp_keepalive_intvl | 探測消息未獲得響應時,重發(fā)該消息的間隔時間(秒)。 |
net.ipv4.tcp_keepalive_probes | 在認定TCP連接失效之前,最多發(fā)送多少個keepalive探測消息。 |
net.ipv4.tcp_sack | 啟用有選擇的應答(1表示啟用),通過有選擇地應答亂序接收到的報文來提高性能,讓發(fā)送者只發(fā)送丟失的報文段,(對于廣域網(wǎng)通信來說)這個選項應該啟用,但是會增加對CPU的占用。 |
net.ipv4.tcp_timestamps | TCP時間戳(會在TCP包頭增加12B),以一種比重發(fā)超時更精確的方法(參考RFC 1323)來啟用對RTT的計算,為實現(xiàn)更好的性能應該啟用這個選項。 |
net.ipv4.tcp_window_scaling | 啟用RFC 1323(參考RFC 1323)定義的window scaling,若要支持超過64 KB的TCP窗口,必須啟用該值(1表示啟用),TCP窗口最大至1 GB,TCP連接雙方都啟用時才生效。 |
net.ipv4.tcp_syncookies | 該參數(shù)表示是否打開TCP同步標簽(
|
net.ipv4.tcp_tw_reuse | 表示是否允許將處于TIME-WAIT狀態(tài)的Socket(TIME-WAIT的端口)用于新的TCP連接。 |
net.ipv4.tcp_tw_recycle | 能夠更快地回收TIME-WAIT套接字。 |
net.ipv4.tcp_fin_timeout | 對于本端斷開的Socket連接,TCP保持在FIN-WAIT-2狀態(tài)的時間(秒)。對端可能會斷開連接或一直不結束連接或不可預料的進程死亡。 |
net.ipv4.ip_local_port_range | 表示TCP/UDP協(xié)議允許使用的本地端口號。 |
net.ipv4.tcp_max_syn_backlog | 該參數(shù)決定了系統(tǒng)中處于
|
net.ipv4.tcp_westwood | 啟用發(fā)送者端的擁塞控制算法,它可以維護對吞吐量的評估,并試圖對帶寬的整體利用情況進行優(yōu)化,對于WAN通信來說應該啟用這個選項。 |
net.ipv4.tcp_bic | 為快速長距離網(wǎng)絡啟用Binary Increase Congestion,這樣可以更好地利用以GB速度進行操作的鏈接,對于WAN通信應該啟用這個選項。 |
net.ipv4.tcp_max_tw_buckets | 該參數(shù)設置系統(tǒng)的TIME_WAIT的數(shù)量,如果超過默認值則會被立即清除。tcp_max_tw_buckets默認值大小會受實例內(nèi)存的影響,最大值為262144。 |
net.ipv4.tcp_synack_retries | 指明了處于SYN_RECV狀態(tài)時重傳SYN+ACK包的次數(shù)。 |
net.ipv4.tcp_abort_on_overflow | 設置該參數(shù)為1時,當系統(tǒng)在短時間內(nèi)收到了大量的請求,而相關的應用程序未能處理時,就會發(fā)送Reset包直接終止這些鏈接。建議通過優(yōu)化應用程序的效率來提高處理能力,而不是簡單地Reset。默認值為0。 |
net.ipv4.route.max_size | 內(nèi)核所允許的最大路由數(shù)目。 |
net.ipv4.ip_forward | 接口間轉發(fā)報文。 |
net.ipv4.ip_default_ttl | 報文可以經(jīng)過的最大跳數(shù)。 |
net.netfilter.nf_conntrack_tcp_timeout_established | 在指定時間內(nèi),已經(jīng)建立的連接如果沒有活動,則通過iptables進行清除。 |
net.netfilter.nf_conntrack_max | 哈希表項最大值。 |