踩坑内核参数tcp_tw_recycle
文章目錄
- 踩坑內(nèi)核參數(shù)tcp_tw_recycle
- 一、問(wèn)題背景
- 二、優(yōu)化分析
- 1.參數(shù)解釋
- 2.原理分析及優(yōu)化建議
- (1)什么是TCP TIME-WAIT狀態(tài):
- (2)TIME-WAIT存在的作用及原因:
- (3)開(kāi)啟tcp_tw_recycle后為什么會(huì)造成網(wǎng)絡(luò)問(wèn)題:
- 現(xiàn)象一:延遲的出現(xiàn)
- 現(xiàn)象二:沒(méi)有ACK回包
- (4) tcp_tw_recycle參數(shù)的移除
- 三、操作步驟
踩坑內(nèi)核參數(shù)tcp_tw_recycle
一、問(wèn)題背景
近期我們發(fā)現(xiàn)客戶生產(chǎn)環(huán)境出現(xiàn)了偶發(fā)性的502報(bào)錯(cuò),表現(xiàn)為點(diǎn)擊瀏覽器或APP頁(yè)面時(shí)會(huì)出現(xiàn)502錯(cuò)誤,復(fù)現(xiàn)概率不高無(wú)明顯規(guī)律。
通過(guò)分析問(wèn)題表現(xiàn)我們判斷可能是以下幾個(gè)問(wèn)題導(dǎo)致:
- 容器ip重復(fù)導(dǎo)致的網(wǎng)絡(luò)時(shí)通時(shí)不通
- iptables規(guī)則中存在reject規(guī)則,導(dǎo)致部分nat過(guò)程被拒絕
- 內(nèi)核參數(shù)tcp_tw_recycle開(kāi)啟導(dǎo)致的tcp time-wait sockets快速回收
根據(jù)以上思路進(jìn)行了問(wèn)題排查,發(fā)現(xiàn)容器ip不存在重復(fù)現(xiàn)象,對(duì)比查看多主機(jī)iptables規(guī)則后并無(wú)異常,因此我們需要繼續(xù)驗(yàn)證是否是由于生產(chǎn)環(huán)境物理機(jī)中開(kāi)啟內(nèi)核參數(shù)tcp_tw_recycle而導(dǎo)致的此問(wèn)題。
我們?cè)跍y(cè)試環(huán)境的虛擬機(jī)上同樣開(kāi)啟了tcp_tw_recycle內(nèi)核參數(shù)以求復(fù)現(xiàn)問(wèn)題。開(kāi)啟該內(nèi)核參數(shù)后,進(jìn)行了頁(yè)面訪問(wèn)測(cè)試,并未復(fù)現(xiàn)502報(bào)錯(cuò)異常。但通過(guò)對(duì)比開(kāi)啟前的情況,我們發(fā)現(xiàn)開(kāi)啟該參數(shù)后界面加載速度明顯變慢但可以正常訪問(wèn)。因此我們認(rèn)為該參數(shù)在開(kāi)啟后對(duì)TCP網(wǎng)絡(luò)連接產(chǎn)生了影響,但由于測(cè)試環(huán)境與生產(chǎn)環(huán)境還是存在一定差異且該參數(shù)的開(kāi)啟與關(guān)閉并不是一定會(huì)觸發(fā)網(wǎng)絡(luò)問(wèn)題。隨后我們?cè)谏a(chǎn)環(huán)境中進(jìn)行抓包,發(fā)現(xiàn)只有SYN包沒(méi)有回SYN和ACK包。這一抓包現(xiàn)象與開(kāi)啟該參數(shù)會(huì)產(chǎn)生的現(xiàn)象吻合度非常高。因此建議關(guān)閉tcp_tw_recycle內(nèi)核參數(shù)以避免此網(wǎng)絡(luò)問(wèn)題的復(fù)現(xiàn),并提供該內(nèi)核參數(shù)的技術(shù)原理以供參考。
二、優(yōu)化分析
1.參數(shù)解釋
這里我們引用linux手冊(cè)TCP協(xié)議的官方解釋。
原文:
tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
Enable fast recycling of TIME_WAIT sockets. Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation).
直譯:
tcp_tw_recycle
啟用TIME-WAIT狀態(tài)sockets的快速回收,這個(gè)選項(xiàng)不推薦啟用。在NAT(Network Address Translation)網(wǎng)絡(luò)下,會(huì)導(dǎo)致大量的TCP連接建立錯(cuò)誤。
2.原理分析及優(yōu)化建議
(1)什么是TCP TIME-WAIT狀態(tài):
首先我們需要理解什么是tcp time-wait狀態(tài)。簡(jiǎn)單來(lái)講通信雙方建立TCP連接后,主動(dòng)關(guān)閉連接的一方就會(huì)進(jìn)入TIME_WAIT狀態(tài),是在closed前的一個(gè)等待狀態(tài),需要的等待時(shí)長(zhǎng)為2MSL(max segment lifetime),目的是為了可靠且正常的關(guān)閉連接。
tcp連接狀態(tài)轉(zhuǎn)換圖:
(2)TIME-WAIT存在的作用及原因:
- 為實(shí)現(xiàn)TCP全雙工連接的可靠釋放,防止上一個(gè)TCP連接的延遲的數(shù)據(jù)包(發(fā)起關(guān)閉,但關(guān)閉沒(méi)完成),被接收后影響到新的TCP連接。
- 當(dāng)最后一個(gè)ACK丟失時(shí),遠(yuǎn)程連接進(jìn)入LAST-ACK狀態(tài),它可以確保遠(yuǎn)程已經(jīng)關(guān)閉當(dāng)前TCP連接。如果沒(méi)有TIME-WAIT狀態(tài),當(dāng)遠(yuǎn)程仍認(rèn)為這個(gè)連接是有效的,則會(huì)繼續(xù)與其通訊,導(dǎo)致這個(gè)連接會(huì)被重新打開(kāi)。當(dāng)遠(yuǎn)程收到一個(gè)SYN 時(shí),會(huì)回復(fù)一個(gè)RST包,因?yàn)檫@SEQ不對(duì),那么新的連接將無(wú)法建立成功,報(bào)錯(cuò)終止。
(3)開(kāi)啟tcp_tw_recycle后為什么會(huì)造成網(wǎng)絡(luò)問(wèn)題:
根據(jù)官方解釋中一個(gè)簡(jiǎn)短的描述:“Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation).”當(dāng)中重點(diǎn)提示了如果在網(wǎng)絡(luò)鏈路中存在nat網(wǎng)絡(luò)不推薦啟用。
我們繼續(xù)分析開(kāi)啟該參數(shù)會(huì)導(dǎo)致的網(wǎng)絡(luò)現(xiàn)象和原因:
現(xiàn)象一:延遲的出現(xiàn)
還是說(shuō)回TIME-WAIT的作用,第一個(gè)作用是避免新的連接(不相關(guān)的)接收到重復(fù)的數(shù)據(jù)包。由于使用了時(shí)間戳,重復(fù)的數(shù)據(jù)包會(huì)因?yàn)閠imestamp過(guò)期而丟棄。第二個(gè)作用是確保遠(yuǎn)程端是不是在LAST-ACK狀態(tài),因?yàn)橛锌赡軄GACK包丟。遠(yuǎn)程端會(huì)重發(fā)FIN包,直到放棄(連接斷開(kāi)),等到ACK包,收到RST包。如果 FIN包接及時(shí)收到,本地端依然是TIME-WAIT狀態(tài),同時(shí),ACK包也會(huì)發(fā)送出去。
當(dāng)新的連接替換了TIME-WAIT的entry,新連接的SYN包會(huì)被忽略掉(得益于timestramps),也不會(huì)應(yīng)答RST包,但會(huì)重傳FIN包。 FIN包將會(huì)收到一個(gè)RST包的應(yīng)答(因?yàn)楸镜剡B接是SYN-SENT狀態(tài)),這會(huì)讓遠(yuǎn)程端跳過(guò)LAST-ACK狀態(tài)。 最初的SYN包將會(huì)在1秒后重新發(fā)送,然后完成連接的建立。看起來(lái)沒(méi)有錯(cuò)誤發(fā)生,只是延遲了一下。
現(xiàn)象狀態(tài)分析圖如下:
現(xiàn)象二:沒(méi)有ACK回包
TIME-WAIT的回收機(jī)制依賴于時(shí)間戳TIMESTAMP,這會(huì)影響到所有連接進(jìn)來(lái)和連接出去的連接。Linux將會(huì)放棄所有來(lái)自遠(yuǎn)程端的timestramp時(shí)間戳小于上次記錄的時(shí)間戳也是遠(yuǎn)程端發(fā)來(lái)的的任何數(shù)據(jù)包。除非TIME-WAIT狀態(tài)已經(jīng)過(guò)期。
當(dāng)遠(yuǎn)程端主機(jī)HOST處于NAT網(wǎng)絡(luò)中時(shí),時(shí)間戳在一分鐘之內(nèi)(MSL時(shí)間間隔)將禁止了NAT網(wǎng)絡(luò)后面,除了這臺(tái)主機(jī)以外的其他任何主機(jī)連接,因?yàn)樗麄兌加懈髯訡PU CLOCK,各自的時(shí)間戳。無(wú)法保證經(jīng)過(guò) NAT 轉(zhuǎn)換后的客戶端 TCP 請(qǐng)求 Header 中的 Timestamp 值嚴(yán)格遞增;(因?yàn)楦骺蛻舳藭r(shí)間可能不同步,很難保證他們的 TCP 請(qǐng)求的 timestamp 嚴(yán)格遞增)
而 kernel 的 PASW 機(jī)制要求所有來(lái)自同一個(gè) Host IP 的 TCP 包 timestamp 必須是遞增的,當(dāng)收到的 timestamp 變小時(shí),會(huì)認(rèn)為這是一個(gè)過(guò)期的數(shù)據(jù)包,將其丟棄。這會(huì)導(dǎo)致很多疑難雜癥,很難去排查。
同時(shí)在nat環(huán)境中會(huì)出現(xiàn)時(shí)間戳錯(cuò)亂的情況,后面的數(shù)據(jù)包就被丟棄了,具體的表現(xiàn)通常是客戶端明明發(fā)送的SYN,但服務(wù)端就是不響應(yīng)ACK(與生產(chǎn)環(huán)境中抓包現(xiàn)象一致)。因?yàn)镹AT設(shè)備將數(shù)據(jù)包的源IP地址都改成了一個(gè)地址(或者少量的IP地址),但是卻基本上不修改TCP包的時(shí)間戳,則會(huì)導(dǎo)致時(shí)間戳混亂。建議:如果網(wǎng)絡(luò)鏈路中存在nat,盡量關(guān)閉快速回收,以免發(fā)生由于時(shí)間戳混亂導(dǎo)致的SYN拒絕問(wèn)題。
(4) tcp_tw_recycle參數(shù)的移除
根據(jù)linux內(nèi)核源代碼樹(shù)的一個(gè)commit,可以看到tcp_tw_recycle參數(shù)已經(jīng)在linux 4.12移除。
原文及鏈接:net.ipv4.tcp_tw_recycle has been removed from Linux?4.12.
The tcp_tw_recycle was already broken for connections behind NAT, since the per-destination timestamp is not monotonically increasing for multiple machines behind a single destination address.After the randomization of TCP timestamp offsets in commit 8a5bd45f6616 (tcp: randomize tcp timestamp offsets for each connection), the tcp_tw_recycle is broken for all types of connections for the same reason: the timestamps received from a single machine is not monotonically increasing, anymore.Remove tcp_tw_recycle, since it is not functional. Also, remove the PAWSPassive SNMP counter since it is only used for tcp_tw_recycle, and simplify tcp_v4_route_req and tcp_v6_route_req since the strict argument is only set when tcp_tw_recycle is enabled.三、操作步驟
#查詢內(nèi)核參數(shù)值 sysctl -a --pattern=tcp_tw_recycle #設(shè)置內(nèi)核參數(shù) sysctl -w net.ipv4.tcp_tw_recycle=0參考鏈接:
https://imroc.io/posts/kubernetes/lost-packets-once-enable-tcp-tw-recycle/
https://support.hpe.com/hpesc/public/docDisplay?docId=emr_na-c00782457
https://coolshell.cn/articles/18654.html
https://www.cnblogs.com/sunsky303/p/12818009.html
總結(jié)
以上是生活随笔為你收集整理的踩坑内核参数tcp_tw_recycle的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vcpkg下载mysql库_VCpkg
- 下一篇: CRF模型详解