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

大神如何不擇手段,精準打擊Linux網絡問題?

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

[[402521]]

內容簡介

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

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

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

不會用crash/ebpf就不能debug內核了嗎?不懂編程就不能優化系統了嗎?并不是。

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

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

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

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

此時應該怎么辦?

經過ss -it確認tcp_info信息,結論是該連接的RWND/CWND,RTT,RTO,MSS等數據均正常,網卡也無相關錯誤統計,但在事實上它就是僵住了,這是一個異常現象,既然Send-Q中有數據,它是無論如何都要 ***嘗試*** 發送出去的。

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

- 應用程序進入系統調用時lock住了socket并且阻塞了。

- 內核存在問題。

如何來確認?大多數人的思路傾向于使用crash工具去分析內核數據結構,但是這是一個龐大的靜態分析工程。

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

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

***因此,TCP的復蘇手術,主要是構造一個ACK去擊打它!***

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

在TCP連接顯示Send-Q堆積的數據發送端構造這個ACK,需要從本機的網卡注入,為了避開路由子系統的Martian報文校驗,需要另起一個net namespace來做這事。

接下來我們來構造這個ACK:

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

然后我們來注入:

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

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

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

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

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

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

### 示例2:實現tun網卡的readv

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

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

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

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

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

io_uring直接拋棄,太復雜了。

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

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

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

- 每一個iovec僅存放一個skb的數據,下一個skb放在下一個iovec。

- 返回copy成功的skb的數量,而不是copy數據的總字節數。

下面是我對tun_do_read的改造:

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

下面是對應的golang代碼:

下面是golang中的Readv:

...

### 示例3:實現松散TCP語義

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

我想為直播業務提供一個松散TCP傳輸協議,如何?

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

- 網絡狀態很好或者輕微丟包時,執行完備TCP邏輯。

- 嚴重擁塞時不再重傳,直接發后面的數據,能不能到達,聽天由命。

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

- ...

這對于直播是有意義的,體現在三個方面:

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

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

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

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

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

因此我用Netfilter:

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

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

 

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

本文轉載自微信公眾號「Linux閱碼場」,可以通過以下二維碼關注。轉載本文請聯系Linux閱碼場公眾號。

 

責任編輯:武曉燕 來源: Linux閱碼場
相關推薦

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

大數據高薪

2021-12-01 10:32:53

超級計算機

2012-08-22 15:17:08

2009-04-22 15:16:30

2015-08-19 09:15:01

設計老板干涉

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

物聯網傳感器技術

2009-05-25 13:50:28

Linux桌面走俏

2019-10-18 09:20:37

身份識別網絡攻擊數據泄露

2009-06-04 08:16:50

卡巴斯基國際立法網絡犯罪

2022-08-09 21:42:33

FacebookMeta攻擊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日产国产成人免费图片 | 中文字幕亚洲精品 | 中国一级特黄真人毛片 | 亚洲高清一区二区三区 | 国产在线视频在线观看 | 91在线影院 | 欧美一区在线视频 | 久久久精 | 成年免费大片黄在线观看岛国 | 视频在线观看一区二区 | 亚洲国产伊人 | 久草在线青青草 | 亚洲欧美成人在线 | 久久精品国产久精国产 | 国产欧美日韩一区二区三区在线观看 | 久久精品国产99国产精品 | 精品久久久久久国产 | 日韩精品一区二区三区在线播放 | 一级片网址 | 久久99精品视频 | 三级av在线 | 国产高清无av久久 | 欧美四虎 | 自拍偷拍av | 日本特黄特色aaa大片免费 | av免费在线观看网站 | 国产精品18久久久久久白浆动漫 | 91 久久| 黄瓜av| 国产目拍亚洲精品99久久精品 | 国产专区在线 | 在线一区视频 | 99精品视频免费观看 | 欧美成人一区二免费视频软件 | 91久久精品国产91久久 | 一本色道久久综合亚洲精品高清 | 日韩av在线中文字幕 | 国产探花在线精品一区二区 | 91亚洲国产成人久久精品网站 | 亚洲色片网站 | 天天躁日日躁狠狠的躁天龙影院 |