LinuxTCP核心引數設定與調優(詳細)!

連結:https://www.cnblogs.com/pgyLang/p/16360102.html

Linux核心中的TCP引數

/proc/sys/net/ipv4/

/proc/sys/net/ipv4/存放著TCP引數的檔案,目錄中的內容用來新增網路設定,在其中的許多設定,可以用來阻止對系統的攻擊,或用來設定系統的路由功能。
tcp_syn_retries 客戶端發起SYN連線,如果超時會進行重傳,重傳的次數
接著我們使用sysctl net.ipv4.tcp_syn_retries=2把這個引數修改為2測試一下
接著我們來驗證一下,我們去ssh一臺不存在的主機,因為ssh也是基於tcp
透過wireshark抓包可以看到,果然重傳了2個數據包
net.ipv4.tcp_window_scaling啟用或關閉視窗擴大因子選項
net.ipv4.tcp_sack啟用或關閉選擇確認(Selective Acknowledgement, SACK)選項
名稱 預設值 建議值 描述
tcpsyn_retries 5 1 對於一個新建連線,核心要傳送多少個SYN連線請求才決定放棄。不應該大於255,預設值是5,對應於180毫秒左右時間。(對於大負載而物理通訊良好的網路來說,這個值偏高,可以修改為2。這個值僅僅是針對對外的連線,對進來的連線,是由tcp_retries1決定)
tcp_synack_retries 5 1 對於遠端的連線請求SYN,核心會發送SYN+ACK資料包,以確認收到上一個SYN連線請求包。這是所謂的三次握手機制的第二個步驟。這裡決定核心再放棄之前所傳送出的SYN+ACK數目。不應該大於255,預設值是5,對應於180秒左右時間。
tcp_keepalive_time 7200 600 TCP傳送keepalive探測訊息的間隔時間(秒),用於確認TCP連線是否有效。防止兩邊建立連線但不傳送資料的攻擊。
tcp_keepalive_probes 9 3 TCP傳送keepalive探測訊息的間隔時間(秒),用於確認TCP連線是否有效。
tcp_keepalive_intvl 74 15 探測訊息未獲得響應時,重發該訊息的間隔時間(秒)。預設值為75秒。(對於普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類伺服器需要改小該值,15是個比較合適的值)
tcp_retries1 3 3 放棄回應一個TCP連線請求前﹐需要進行多少次重試。RFC 規定最低的數值是3
tcp_retries2 15 5 在丟棄啟用(已建立通訊狀況)的TCP連線之前﹐需要進行多少次重試。預設值為15,根據RTO的值來決定,相當於13-30分鐘(RFC1122規定,必須大於100秒) (這個值根據目前的網路設定,可以適當地改小,我的網路內修改為了5)
tcp_orphan_retries 7 3 在近端丟棄TCP連線之前﹐要進行多少次重試。預設值是7個﹐相當於 50秒 – 16分鐘﹐視 RTO 而定。如果您的系統是負載很大的web伺服器﹐那麼也許需要降低該值,這類 sockets 可能會耗費大量的資源。另外參的考tcp_max_orphans
tcp_fin_timeout 60 2 對於本端斷開的socket連線,TCP保持在FIN-WAIT-2狀態的時間。對方可能會斷開連線或一直不結束連線或不可預料的程序死亡。預設值為 60 秒
tcp_max_tw_buckets 180000 36000 系統在同時所處理的最大 timewait sockets 數目。如果超過此數的話,time-wait socket 會被立即砍除並且顯示警告資訊。之所以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐不過﹐如果網路條件需要比預設值更多﹐則可以提高它(或許還要增加記憶體)。(事實上做NAT的時候最好可以適當地增加該值)
tcp_tw_recycle 0 1 開啟快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求﹐請不要隨意修改這個值。(做NAT的時候,建議開啟它)
tcp_tw_reuse 0 1 表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP連線(這個對快速重啟動某些服務,而啟動後提示埠已經被使用的情形非常有幫助)
tcp_max_orphans 8192 32768 系統所能處理不屬於任何程序的TCP sockets最大數量。假如超過這個數量,那麼不屬於任何程序的連線會被立即reset,並同時顯示警告資訊。之所以要設定這個限制,純粹為了抵禦那些簡單的 DoS 攻擊,千萬不要依賴這個或是人為的降低這個限制。如果記憶體大更應該增加這個值。(這個值Redhat AS版本中設定為32768,但是很多防火牆修改的時候,建議該值修改為2000)
tcp_abort_on_overflow 0 0 當守護程序太忙而不能接受新的連線,就象對方傳送reset訊息,預設值是false。這意味著當溢位的原因是因為一個偶然的猝發,那麼連線將恢復狀態。只有在你確信守護程序真的不能完成連線請求時才打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這類服務的時候,這個可以很快讓客戶端終止連線,可以給予服務程式處理已有連線的緩衝機會,所以很多防火牆上推薦開啟它)
tcp_synookies 0 1 只有在核心編譯時選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢位時象對方傳送syncookies。目的是為了防止syn flood攻擊。
tcp_stdurg 0 0 使用 TCP urg pointer 欄位中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,因此如果您在 Linux 開啟它,或會導致不能和它們正確溝通。
tcp_max_syn_backlog 1024 16384 對於那些依然還未獲得客戶端確認的連線請求,需要儲存在佇列中最大數目。對於超過 128Mb 記憶體的系統,預設值是 1024 ,低於 128Mb 的則為 128。如果伺服器經常出現過載,可以嘗試增加這個數字。假如您將此值設為大於 1024,最好修改include/net/tcp.h裡面的TCP_SYNQ_HSIZE,以保持TCP_SYNQ_HSIZE*16(SYN Flood攻擊利用TCP協議散佈握手的缺陷,偽造虛假源IP地址傳送大量TCP-SYN半開啟連線到目標系統,最終導致目標系統Socket佇列資源耗盡而無法接受新的連線。為了應付這種攻擊,現代Unix系統中普遍採用多連線佇列處理的方式來緩衝(而不是解決)這種攻擊,是用一個基本佇列處理正常的完全連線應用(Connect()和Accept() ),是用另一個佇列單獨存放半開啟連線。這種雙佇列處理方式和其他一些系統核心措施(例如Syn-Cookies/Caches)聯合應用時,能夠比較有效的緩解小規模的SYN Flood攻擊(事實證明)
tcp_window_scaling 1 1 該檔案表示設定tcp/ip會話的滑動視窗大小是否可變。引數值為布林值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的視窗最大可達到65535位元組,對於高速網路,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動視窗大小增大數個數量級,從而提高資料傳輸的能力(RFC 1323)。
tcp_timestamps 1 1 Timestamps 用在其它一些東西中,可以防範那些偽造的sequence號碼。一條1G的寬頻線路或許會重遇到帶 out-of-line數值的舊sequence 號碼(假如它是由於上次產生的)。Timestamp 會讓它知道這是個 ‘舊封包’。(該檔案表示是否啟用以一種比超時重發更精確的方法(RFC 1323)來啟用對RTT的計算;為了實現更好的效能應該啟用這個選項。)
tcp_sack 1 1 使用 Selective ACK,它可以用來查詢特定的遺失的資料報— 因此有助於快速恢復狀態。該檔案表示是否啟用有選擇的應答(Selective Acknowledgment),這可以透過有選擇地應答亂序接收到的報文來提高效能,這樣可以讓傳送者只發送丟失的報文段。對於廣域網通訊來說這個選項應該啟用,但是這會增加對 CPU 的佔用。
tcp_fack 1 1 開啟FACK擁塞避免和快速重傳功能。注意,當tcp_sack設定為0的時候,這個值即使設定為1也無效,這個是TCP連線靠譜的核心功能
tcp_dsack 1 1 允許TCP傳送”兩個完全相同”的SACK
tcp_ecn 0 0 TCP的直接擁塞通告功能。
tcp_reordering 3 6 TCP流中重排序的資料報最大數量。一般有看到推薦把這個數值略微調整大一些
tcp_retans_collapse 1 0 對於某些有bug的印表機提供針對其bug的相容性。一般不需要這個支援,可以關閉它
tcp_wmem:mindefaultmax 4096 16384 131072 8192 131072 16777216 傳送快取設定。 min:為TCP socket預留用於傳送緩衝的記憶體最小值。每個tcp socket都可以在建議以後都可以使用它。預設值為4096(4K)。 default:為TCP socket預留用於傳送緩衝的記憶體數量,預設情況下該值會影響其它協議使用的net.core.wmem_default 值,一般要低於net.core.wmem_default的值。預設值為16384(16K)。 max: 用於TCP socket傳送緩衝的記憶體最大值。該值不會影響net.core.wmem_max,”靜態”選擇引數SO_SNDBUF則不受該值影響。預設值為131072(128K)。對於伺服器而言,增加這個引數的值對於傳送資料很有幫助
tcprmem:mindefaultmax 4096 87380 174760 32768 131072 16777216 接收快取設定。同tcp_wmem
tcp_mem:mindefaultmax 根據記憶體計算 786432 1048576 1572864 low:當TCP使用了低於該值的記憶體頁面數時,TCP不會考慮釋放記憶體。即低於此值沒有記憶體壓力。(理想情況下,這個值應與指定給 tcp_wmem 的第 2 個值相匹配 – 這第 2 個值表明,最大頁面大小乘以最大併發請求數除以頁大小 (131072 300 / 4096)。) pressure:當TCP使用了超過該值的記憶體頁面數量時,TCP試圖穩定其記憶體使用,進入pressure模式,當記憶體消耗低於low值時則退出pressure狀態。(理想情況下這個值應該是 TCP 可以使用的總緩衝區大小的最大值 (204800 300 / 4096)。) high:允許所有tcp sockets用於排隊緩衝資料報的頁面量。(如果超過這個值,TCP 連線將被拒絕,這就是為什麼不要令其過於保守 (512000 *300 / 4096) 的原因了。在這種情況下,提供的價值很大,它能處理很多連線,是所預期的 2.5 倍;或者使現有連線能夠傳輸 2.5 倍的資料。
tcp_app_win 31 31 保留max(window/2^tcp_app_win, mss)數量的視窗由於應用緩衝。當為0時表示不需要緩衝。
tcp_adv_win_scale 2 2 計算緩衝開銷。
tcp_low_latency 0 0 允許 TCP/IP 棧適應在高吞吐量情況下低延時的情況;這個選項一般情形是的停用。
tcp_westwood 0 0 啟用傳送者端的擁塞控制演算法,它可以維護對吞吐量的評估,並試圖對頻寬的整體利用情況進行最佳化;對於 WAN 通訊來說應該啟用這個選項。
tcp_bic 0 0 為快速長距離網路啟用 Binary Increase Congestion;這樣可以更好地利用以 GB 速度進行操作的連結;對於 WAN 通訊應該啟用這個選項。
ip_forward 0 1 NAT必須開啟IP轉發支援,把該值寫1
ip_local_port_range:minmax 32768 61000 1024 65000 表示用於向外連線的埠範圍,預設比較小,這個範圍同樣會間接用於NAT表規模。
ip_conntrack_max 65535 65535 系統支援的最大ipv4連線數,預設65536(事實上這也是理論最大值),同時這個值和你的記憶體大小有關,1G以上記憶體這個值都是預設65536

/proc/sys/net/core/

/proc/sys/net/core/目錄中包括許多設定用來控制Linux核心與網路層的互動,即當網路有什麼動作時,核心做出什麼樣的相應反應。
名稱 預設值 建議值 描述
netdev_max_backlog 1024 16384 每個網路介面接收資料包的速率比核心處理這些包的速率快時,允許送到佇列的資料包的最大數目,對重負載伺服器而言,該值需要調高一點。
somaxconn 128 16384 用來限制監聽佇列最大資料包的數量,超過這個數量就會導致連結超時或者觸發重傳機制。web應用中listen函式的backlog預設會給我們核心引數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG預設為511,所以有必要調整這個值。對繁忙的伺服器,增加該值有助於網路效能
wmem_default 129024 129024 預設的傳送視窗大小(位元組)
rmem_default 129024 129024 預設的接收視窗大小(位元組)
rmem_max 129024 873200 最大的TCP資料接收緩衝(位元組)
wmem_max 129024 873200 最大的TCP資料傳送緩衝(位元組)
/proc/sys/net/netfilter/是對netfilter的引數配置,具體可以參照Linux核心文件

修改核心引數的方法

  1. 使用 echo value 方式直接追加到檔案中。如 echo "1" > /proc/sys/net/ipv4/tcp_syn_retries ,但是這種方式裝置重啟後,會恢復成預設值。
  2. 把引數新增到 /etc/sysctl.conf 中,然後執行 sysctl -p 使引數生效。這種方式是永久有效的。
  3. 使用systcl命令進行修改,例如修改SYN重傳次數sysctl net.ipv4.tcp_syn_retries=n

檢視Linux系統的統計資訊

下面的eth0換成需要檢視的網絡卡

sys/class/net/eth0/statistics/rx_packets 收到的資料包數量
sys/class/net/eth0/statistics/tx_packets 傳輸的資料包數量
sys/class/net/eth0/statistics/rx_bytes 接收的位元組數
sys/class/net/eth0/statistics/tx_bytes 傳輸的位元組數
sys/class/net/eth0/statistics/rx_dropped 收包時丟棄的資料包
sys/class/net/eth0/statistics/tx_dropped 發包時丟棄的資料包
複製程式碼

Linux網絡卡的引數可以在/sys/class/net/進入對應網絡卡目錄去檢視,比如網絡卡的MAC地址速率(speed),MTU等等

END
官方站點:www.linuxprobe.com
Linux命令大全:www.linuxcool.com
劉遄老師QQ:5604215
Linux技術交流群:2636170
(新群,火熱加群中……)
想要學習Linux系統的讀者可以點選"閱讀原文"按鈕來了解書籍《Linux就該這麼學》,同時也非常適合專業的運維人員閱讀,成為輔助您工作的高價值工具書!


相關文章