【必看】Linux 下的 TCP参数优化
簡介
???????TCP是一種面向廣域網的通信協議,目的是在跨越多個網絡通信時,為兩個通信端點之間提供一條具有下列特點的通信方式
?????(1)基于流的方式;
?????(2)面向連接;
?????(3)可靠通信方式;
?????(4)在網絡狀況不佳的時候盡量降低系統由于重傳帶來的帶寬開銷;
?????(5)通信連接維護是面向通信的兩個端點的,而不考慮中間網段和節點。
下面,講點實際的東西
上圖詳細描述了TCP的三次握手和四次揮手
這圖畫的不錯吧,,,所以不是我畫的,下面的相關參數陳述和優化各位可以參照這個圖,人家畫的很不錯我自己就不獻丑了,,絕對不是懶得關系
下述是具體的TCP參數的優化方案
請根據實際情況進行優化!!!
#表示socket監聽的backlog(當一個請求(request)尚未被處理或建立時,進入backlog)上限
#限制了接收新 TCP 連接偵聽隊列的大小。對于一個經常處理新連接的高負載 web服務環境來說,默認的 128 太小了。大多數環境這個值建議增加到 1024 或者更多。服務進程會自己限制偵聽隊列的大小(例如 sendmail(8) 或者 Apache),常常在它們的配置文件中有設置隊列大小的選項。大的偵聽隊列對防止拒絕服務 DoS ***也會有所幫助。
net.core.somaxconn = 262144
#表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關閉
net.ipv4.tcp_tw_reuse = 1
#表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉
net.ipv4.tcp_tw_recycle = 0
#keepalive的保持時間
net.ipv4.tcp_keepalive_time = 900
#表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間(可改為30,一般來說FIN-WAIT-2的連接也極少)
net.ipv4.tcp_fin_timeout = 15
#用于向外連接的端口范圍
net.ipv4.ip_local_port_range = 10000 65500
#預留端口避免占用,不同的端口可以逗號隔開
net.ipv4.ip_local_reserved_ports = 50010,10050,32275
#表示那些尚未收到客戶端確認信息的連接(SYN消息)隊列的長度,默認為1024,加大隊列長度為819200,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_max_syn_backlog = 819200
#TIME_WAIT 狀態數量
#表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除并打印告警信息。默認為180000,更改為8192000.對于Apache,Nginx等服務器,上幾行參數可以很好的減少TIME_WAIT套接字數量,但是對于Squid,效果不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死
net.ipv4.tcp_max_tw_buckets = 8192000
#該參數用于設定系統中最多允許存在多少tcp套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,沒有與用戶文件句柄關聯的tcp套接字符將立即被復位,同時給出警告信息。這個限制只是為了防止簡單的DoS工具。一般在系統內存比較充足的情況下,可以增大這個參數的賦值:
net.ipv4.tcp_max_orphans = 3276800
#CONNTRACK_MAX 允許的最大跟蹤連接條目,是在內核內存中netfilter可以同時處理的“任務”(連接跟蹤條目)
net.netfilter.nf_conntrack_max = 250000
#tcp_synack_retries 顯示或設定 Linux 核心在回應 SYN 要求時會嘗試多少次重新發送初始 SYN,ACK 封包后才決定放棄。這是所謂的三段交握 (threeway handshake) 的第二個步驟。即是說系統會嘗試多少次去建立由遠端啟始的 TCP 連線。tcp_synack_retries 的值必須為正整數,并不能超過 255。因為每一次重新發送封包都會耗費約 30 至 40 秒去等待才決定嘗試下一次重新發送或決定放棄。tcp_synack_retries 的缺省值為 5,即每一個連線要在約 180 秒 (3 分鐘) 后才確定逾時.
net.ipv4.tcp_synack_retries = 2
#對于一個新建連接,內核要發送多少個 SYN 連接請求才決定放棄。不應該大于255,默認值是5,對應于180秒左右時間。(對于大負載而物理通信良好的網絡而言,這個值偏高,可修改為2.這個值僅僅是針對對外的連接,對進來的連接,是由tcp_retries1 決定的)
net.ipv4.tcp_syn_retries = 2
#四種TCP狀態的超時時間
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 15
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
#當探測沒有確認時,重新發送探測的頻度。缺省是75秒。
net.ipv4.tcp_keepalive_intvl = 15
#在認定連接失效之前,發送多少個TCP的keepalive探測包。缺省值是9。這個值乘以tcp_keepalive_intvl之后決定了,一個連接發送了keepalive之后可以有多少時間沒有回應
net.ipv4.tcp_keepalive_probes = 5
#本端試圖關閉TCP連接之前重試多少次。缺省值是7,相當于50秒~16分鐘(取決于RTO)。如果你的機器是一個重載的WEB服務器,你應該考慮減低這個值,因為這樣的套接字會消耗很多重要的資源。參見tcp_max_orphans.
net.ipv4.tcp_orphan_retries = 0
#支持更大的TCP窗口. 如果TCP窗口最大超過65535(64K), 必須設置該數值為1
net.ipv4.tcp_window_scaling = 1
#當 tcp 建立連接的 3 路握手完成后,將連接置入 ESTABLISHED 狀態并交付給應用程序的 backlog 隊列時,會檢查 backlog 隊列是否已滿。若已滿,通常行為是將連接還原至 SYN_ACK 狀態,以造成 3 路握手最后的 ACK 包意外丟失假象 —— 這樣在客戶端等待超時后可重發 ACK —— 以再次嘗試進入 ESTABLISHED 狀態 —— 作為一種修復/重試機制。如果啟用 tcp_abort_on_overflow 則在檢查到 backlog 隊列已滿時,直接發 RST 包給客戶端終止此連接 —— 此時客戶端程序會收到 104 Connection reset by peer 錯誤。
net.ipv4.tcp_abort_on_overflow = 1
#管理TCP的選擇性應答,允許接收端向發送端傳遞關于字節流中丟失的序列號,減少了
段丟失時需要重傳的段數目,當段丟失頻繁時,sack是很有益的。
net.ipv4.tcp_sack = 1
#關閉tcp的連接傳輸的慢啟動,即先休止一段時間,再初始化擁塞窗口。
net.ipv4.tcp_slow_start_after_idle = 0
#每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目
net.core.netdev_max_backlog = 300000
#內核分配給TCP連接的內存,單位是Page,1 Page = 4096 Bytes,可用命令查看:
#getconf PAGESIZE
#第一個數字表示,當 tcp 使用的 page 少于 1048576 時,kernel 不對其進行任何的干預
#第二個數字表示,當 tcp 使用了超過 1310720 的 pages 時,kernel 會進入 “memory pressure” 壓力模式
#第三個數字表示,當 tcp 使用的 pages 超過 1572864 時(相當于1.6GB內存),就會報:Out of socket memory
net.ipv4.tcp_mem = 1048576 1310720 1572864
#為每個TCP連接分配的讀、寫緩沖區內存大小,單位是Byte
#第一個數字表示,為TCP連接分配的最小內存
#第二個數字表示,為TCP連接分配的缺省內存
#第三個數字表示,為TCP連接分配的最大內存
#一般按照缺省值分配,下面的例子就是讀寫均為8KB,共16KB
#1572864*16kb=25165824kb 相當于26G內存
net.ipv4.tcp_rmem = 4096 8192 16384
#默認的TCP數據接收窗口大小(字節)。
net.core.rmem_default = 1048576
#最大的TCP數據接收窗口(字節)。
net.core.rmem_max = 15728640
#為自動調優定義每個 socket 使用的內存。
#第一個值是為 socket 的發送緩沖區分配的最少字節數。
#第二個值是默認值(該值會覆蓋 wmem_default),緩沖區在系統負載不重的情況下可以增長到這個值。
#第三個值是發送緩沖區空間的最大字節數(該值會覆蓋 wmem_max)。
net.ipv4.tcp_wmem = 256000 768000 4194304
#各種類型的socket默認讀寫緩沖器大小
net.core.wmem_default = 1048576
#各種類型的socket默認讀寫緩沖器最大值
net.core.wmem_max = 5242880
#panic error中自動重啟,等待timeout為20秒
kernel.panic = 20
#表示系統級別的能夠打開的文件句柄的數量。是對整個系統的限制,并不是針對用戶的。
fs.file-max = 6553560
上述很多參數值得修改,并非是絕對要這樣,各位還是要根據實際需求進行參照
思量
那這些參數如何優化呢?我怎么知道如何修改比較合理呢
我的建議是,基礎優化之后,進行監控,查看tcp的資源消耗和具體卡在哪里
下面是一些Linux系統下面TCP監控的大概獲取方式,僅供參考
查看當前的連接數:
代碼如下:
grep ip_conntrack /proc/slabinfo
ip_conntrack 38358 64324 304 13 1 : tunables 54 27 8 : slabdata 4948 4948 216
獲取TCP各個握手揮手的實際當前數值
代碼如下:
# netstat -an | awk '/^tcp/ {++state[$6]} END {for (key in state) print key,"\t",state[key]}'
TIME_WAIT 1832
CLOSE_WAIT 360
FIN_WAIT2 12
ESTABLISHED 3588
SYN_RECV 148
CLOSING 7
LAST_ACK 19
LISTEN 59
查出目前 ip_conntrack 的排名:
代碼如下:
$ cat /proc/net/nf_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10
總結
還是最好根據實際情況進行參數調整,才最科學,不要盲目加大或者一刀切為上策
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的【必看】Linux 下的 TCP参数优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wifi 7都来了?
- 下一篇: IPv6静态路由怎么配置?