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