成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大神如何不擇手段,精準打擊Linux網(wǎng)絡(luò)問題?

系統(tǒng) Linux
我們在工作中總是遇到一些需要快速解決的棘手問題,解決這類問題往往有一套可供遵循的常規(guī)思路,但是實際做起來往往非常耗時且依賴外部環(huán)境,更加棘手的是,為了按部就班地完成工作,你需要學習很多很多前置知識,比方說相關(guān)工具的使用。

[[402521]]

內(nèi)容簡介

本文是大廠著名大神Dog250在調(diào)試一些網(wǎng)絡(luò)問題時候的實戰(zhàn),希望讀者通過閱讀本文,領(lǐng)悟大神們是如何“不擇手段,利用手頭一切的便利,最快的速度精準打擊問題要害”,從而實現(xiàn)快速調(diào)試和解決問題的。

我們在工作中總是遇到一些需要快速解決的棘手問題,解決這類問題往往有一套可供遵循的常規(guī)思路,但是實際做起來往往非常耗時且依賴外部環(huán)境,更加棘手的是,為了按部就班地完成工作,你需要學習很多很多前置知識,比方說相關(guān)工具的使用。

我傾向于用最少的工作量來完成POC。

不會用crash/ebpf就不能debug內(nèi)核了嗎?不懂編程就不能優(yōu)化系統(tǒng)了嗎?并不是。

讓我來展示一下縣城擺攤修傘的二胡師傅和瑞士宮廷制表匠的區(qū)別吧。

本文我會舉三個實際的例子。用的都是low到爆的過時玩意兒。

### 示例1:排查TCP連接僵死

netstat顯示一條TCP連接的Send-Q堆積了很多數(shù)據(jù),對端相應(yīng)的Recv-Q卻是0,tcpdump顯示該連接持續(xù)無任何交互。

此時應(yīng)該怎么辦?

經(jīng)過ss -it確認tcp_info信息,結(jié)論是該連接的RWND/CWND,RTT,RTO,MSS等數(shù)據(jù)均正常,網(wǎng)卡也無相關(guān)錯誤統(tǒng)計,但在事實上它就是僵住了,這是一個異常現(xiàn)象,既然Send-Q中有數(shù)據(jù),它是無論如何都要 ***嘗試*** 發(fā)送出去的。

幾乎可以肯定,原因無外乎兩點:

- 應(yīng)用程序進入系統(tǒng)調(diào)用時lock住了socket并且阻塞了。

- 內(nèi)核存在問題。

如何來確認?大多數(shù)人的思路傾向于使用crash工具去分析內(nèi)核數(shù)據(jù)結(jié)構(gòu),但是這是一個龐大的靜態(tài)分析工程。

我傾向于開著飛機修引擎,我不擅長分析死因,但我擅長做復(fù)蘇。我的方法是嘗試給該TCP做復(fù)蘇手術(shù)。

TCP的發(fā)送一直是靠ACK時鐘驅(qū)動的,事實上直到BBR開啟的基于pacing的新TCP時代,也依然沒有放棄ACK時鐘,雖然ACK在原教旨意義上不再需要,但BBR依然使用它來計算pacing rate,假如沒有ACK到來了,那么pacing rate便會逐漸跌到0,TCP也就僵住了。

***因此,TCP的復(fù)蘇手術(shù),主要是構(gòu)造一個ACK去擊打它!***

如果你對TCP足夠了解,那么你一定會大贊我的做法。

在TCP連接顯示Send-Q堆積的數(shù)據(jù)發(fā)送端構(gòu)造這個ACK,需要從本機的網(wǎng)卡注入,為了避開路由子系統(tǒng)的Martian報文校驗,需要另起一個net namespace來做這事。

接下來我們來構(gòu)造這個ACK:

為了最快速定位問題,我往往不會遵守什么編碼規(guī)范,所以我會寫死地址和端口,哪怕需要改的時候再編輯一下代碼。

然后我們來注入:

注意,代碼中的seq,ack字段我們并不知道,如何將這個ACK來精確注入這個僵死的TCP連接?

精確注入需要兩步,用一個bpftrace腳本配合上述python代碼獲取TCP的snd_una,rcv_nxt等字段:

注意,我hook的是tcp_rcv_established,當我實施第一步注入的時候,沒有進入這個trace,那幾乎可以肯定是應(yīng)用程序lock住了該連接,進而將該ACK排入了backlog以延后處理,這種情況就需要應(yīng)用程序開發(fā)人員來接鍋了。

如果順利進入了該trace,那么我們便獲取了TCP連接的info信息,接下來我們可以用打印出來的snd_una,rcv_nxt信息來填充python代碼中的seq和ack了:

ACK構(gòu)造配合bpftrace腳本,如此便可以一路跟蹤到數(shù)據(jù)的發(fā)送邏輯,進而定位發(fā)送僵死的原因。核心的思路我已經(jīng)給出了,本文不是case by case分析,也就沒有繼續(xù)的必要了。

順便說一句,我不喜歡使用bpftrace,太麻煩且限制太多,還是systemtap順手,特別是-g選項。bpftrace無需編譯執(zhí)行快并非不可或缺的優(yōu)點,大家都用bpftrace更多是因為它新潮。

### 示例2:實現(xiàn)tun網(wǎng)卡的readv

最近我雖然將golang實現(xiàn)的tun UDP隧道的總吞吐逼近了物理網(wǎng)卡極限25Gbps,但是對于單流吞吐而言,卻一直無法突破2~3Gbps,因此我想看看瓶頸到底在哪。

事實上,允許IP分片的情況下,我把tun的MTU設(shè)置成8000,單流吞吐可達8Gbps。然而在長傳有丟包的線路,IP分片(分片丟失會造成TCP時鐘卡頓)可能會使TCP的性能劣化,打亂BBR所依賴的pacing rate保真。

之前測量的結(jié)果,直連環(huán)境,通過tun UDP隧道的ping時延是物理網(wǎng)卡ping時延的10倍起步,那么tun和UDP socket處理的系統(tǒng)消耗大概要損耗10倍起步的吞吐,25Gbps下降到2~3Gbps是合理的。

因此我需要減少tun的read/write開銷。

批量讀寫是一個合理的思路,比方說io_uring,readv/writev等。可是tun并不支持這些,怎么辦?

io_uring直接拋棄,太復(fù)雜了。

如果要實現(xiàn)一個完備的讀寫數(shù)據(jù)包的readv/writev,我需要在內(nèi)核和用戶態(tài)均實現(xiàn)數(shù)據(jù)包邊界的拆包組包問題,我不得不處理各種協(xié)議,以在一塊整個的內(nèi)存中獲取數(shù)據(jù)包的長度并把它切下來,我不得不時刻當心內(nèi)存的邊界,把不連續(xù)的內(nèi)存想辦法組合成一個看上去連續(xù)的內(nèi)存,以便后面的加密解密goroutine可以處理它們。

這看上去很復(fù)雜,需要對整個程序進行修改(當然了,這對于標準程序員根本不是事,但對于我,這很要命),至少也要花費一整天的時間,可作為業(yè)余的事情,每天回家都很晚了,我哪有時間折騰這些。

下面是我一個小時完成事情全部的做法。我改變了readv的語義:

- 每一個iovec僅存放一個skb的數(shù)據(jù),下一個skb放在下一個iovec。

- 返回copy成功的skb的數(shù)量,而不是copy數(shù)據(jù)的總字節(jié)數(shù)。

下面是我對tun_do_read的改造:

就這么幾行代碼。是不是很簡單。

下面是對應(yīng)的golang代碼:

下面是golang中的Readv:

...

### 示例3:實現(xiàn)松散TCP語義

來,最后一個例子,我簡單說。

我想為直播業(yè)務(wù)提供一個松散TCP傳輸協(xié)議,如何?

什么是松散TCP?很容易理解:

- 網(wǎng)絡(luò)狀態(tài)很好或者輕微丟包時,執(zhí)行完備TCP邏輯。

- 嚴重擁塞時不再重傳,直接發(fā)后面的數(shù)據(jù),能不能到達,聽天由命。

- 接收端可以發(fā)送NAK指示發(fā)送端是否重傳。

- ...

這對于直播是有意義的,體現(xiàn)在三個方面:

- 直播防卡頓體驗要比清晰度體驗更核心,嚴重擁塞時用戶可以接受模糊但不能接受卡頓,因此可以丟幀,但不能卡住。

- 直播流量在嚴重擁塞時的松散非重傳處理可以降低帶寬成本。

- 大家都不拼命重傳了,或許網(wǎng)絡(luò)擁塞就過去了,可期待一種良性全局同步。

既能優(yōu)化體驗,又能降低成本,何樂而不為?那么怎么落地呢?

開會立項,確定deadline,然后大改TCP協(xié)議的實現(xiàn)代碼嗎?Linux內(nèi)核中TCP的那一大脬代碼能把人看瘋。誰人改得動?然后可以期許的就是開會,延期,加班,哪來的快樂?

因此我用Netfilter:

- 發(fā)送端在IP層用Netfilter截獲出方向的TCP段,在嚴重擁塞時偽造ACK回復(fù)。

- 接收端在IP層用Netfilter截獲入方向的TCP段,在嚴重擁塞時用0填充丟包亂序造成的sequence空洞。

 

是不是不依賴TCP本身的實現(xiàn)了呢?而且實現(xiàn)起來很快,可以唱著歌寫。先把0.1版本推上去了,業(yè)務(wù)點了贊,然后慢慢再改那脬TCP代碼。

本文轉(zhuǎn)載自微信公眾號「Linux閱碼場」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Linux閱碼場公眾號。

 

責任編輯:武曉燕 來源: Linux閱碼場
相關(guān)推薦

2010-06-04 10:40:22

win7水樹奈奈

2013-11-14 13:26:30

IE補丁Windows XP

2011-08-01 10:21:42

2010-07-01 15:52:30

2013-11-14 11:38:43

Windows XPIE補丁

2016-11-23 09:47:10

2015-09-30 09:26:38

大數(shù)據(jù)高薪

2021-12-01 10:32:53

超級計算機

2012-08-22 15:17:08

2009-04-22 15:16:30

2015-08-19 09:15:01

設(shè)計老板干涉

2011-11-28 12:12:57

2022-12-08 10:30:19

2015-07-30 09:48:38

自學編程3遍讀書法

2009-02-24 09:59:11

2020-05-11 17:12:38

物聯(lián)網(wǎng)傳感器技術(shù)

2009-05-25 13:50:28

Linux桌面走俏

2019-10-18 09:20:37

身份識別網(wǎng)絡(luò)攻擊數(shù)據(jù)泄露

2009-06-04 08:16:50

卡巴斯基國際立法網(wǎng)絡(luò)犯罪

2022-08-09 21:42:33

FacebookMeta攻擊
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 黄免费观看视频 | 午夜激情一区 | 欧美成人精品激情在线观看 | 国产精品视屏 | 激情欧美日韩一区二区 | 欧美日韩精品中文字幕 | 亚洲高清久久 | 日韩福利电影 | 一区二区在线不卡 | 亚洲一区成人 | 久久成人人人人精品欧 | 成人二区 | 亚洲午夜一区二区 | 精品一区二区三区在线视频 | 91就要激情 | 国产一级片一区二区 | v亚洲 | 夜夜爽99久久国产综合精品女不卡 | 亚洲综合视频 | 欧美日韩不卡合集视频 | 国产精品成人一区二区 | 色婷婷激情| 亚洲天堂男人的天堂 | 色一情一乱一伦一区二区三区 | 久久久新视频 | 日本不卡一区二区三区 | 精品国产乱码 | 久久久精品视频免费 | 在线视频亚洲 | 亚洲一区二区在线 | 亚洲欧美综合精品久久成人 | 日日夜夜精品视频 | 久久97精品 | 国产资源一区二区三区 | 亚洲精品女人久久久 | 欧美精品一区二区蜜桃 | 国产精品国产馆在线真实露脸 | 免费国产精品久久久久久 | 视频在线亚洲 | 亚洲一区二区在线视频 | 日韩视频一区二区 |