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