五分鐘看懂抓包神技:DPDK
我是一個(gè)網(wǎng)絡(luò)監(jiān)控軟件,我開發(fā)的任務(wù)是監(jiān)控所有進(jìn)出網(wǎng)絡(luò)的流量。
一直以來,我的工作都很好,但是伴隨著我所監(jiān)控的網(wǎng)絡(luò)越來越大,網(wǎng)絡(luò)中的通信流量越來越多,一開始我就不堪重負(fù),逐漸出現(xiàn)丟包現(xiàn)象,最近這種現(xiàn)象越來越嚴(yán)重。
巨大的交通需求
一天晚上,我的程序員哥哥把我從硬盤里叫了出來。
幾點(diǎn)了你怎么還不下班我問我的小弟弟
哎,產(chǎn)品經(jīng)理說我下個(gè)月要支持萬兆網(wǎng)絡(luò)流量的分析我壓力很大,沒辦法,只能加班,說完整理了一下自己稀疏的頭發(fā)
十萬億10Gbps你在開玩笑嗎這是要?dú)⑽业墓?jié)奏
是不是,可急死我了快告訴我,你工作這么久了,有什么不開心或者覺得可以改善的可以告訴我我的小弟弟真誠(chéng)地看著我
我想了一下說:要說不好聽的,那是真的!就是我現(xiàn)在花了太多時(shí)間復(fù)制包,從內(nèi)核空間復(fù)制包到用戶空間以前數(shù)據(jù)量小,現(xiàn)在網(wǎng)絡(luò)流量這么大,真是要命
小哥哥嘆了口氣,哎,這是改不了的通過操作系統(tǒng)的API獲取數(shù)據(jù)包,從網(wǎng)卡讀取操作系統(tǒng)我們是在用戶空間工作的程序,要復(fù)制一次沒辦法想點(diǎn)別的
我也嘆了口氣,好吧,還有一個(gè)槽收到數(shù)據(jù)包后,可以直接給我嗎不要把它交給系統(tǒng)的協(xié)議棧和netfilter框架去處理反正我?guī)Я艘院筮€要重新分析,每次都是從他們那里傳過去的他們效率低,不拖累我的工作
我小哥皺著眉頭眨著眼睛說:大哥,這個(gè)我們改不了我水平有限,還沒能改造你繞過操作系統(tǒng)讓你直接處理網(wǎng)卡不然你怎么不說另一個(gè)
好,我不會(huì)為難你有一個(gè)簡(jiǎn)單的問題,你要改
有什么問題嗎跟我說說
就是我現(xiàn)在在線程切換上花了很多時(shí)間,當(dāng)我再次得到調(diào)度執(zhí)行的時(shí)候,經(jīng)常發(fā)現(xiàn)我換了一個(gè)CPU核,導(dǎo)致之前的緩存失效,我不得不重新建立緩存。這又是一大浪費(fèi)!我不能讓我的工作線程獨(dú)占CPU的核心,這樣肯定能提高我的工作效率!
小哥想了一下,說:沒問題,這個(gè)你可以要!可以通過線程關(guān)聯(lián)來完成我給你畫幾個(gè)核心,不要讓他們參與系統(tǒng)的線程調(diào)度和分配這是給你用的
中斷問題
過了幾天,程序員哥哥給我升級(jí)了,讓我的幾個(gè)工作線程可以獨(dú)占CPU核,工作效率提高了不少。
但離產(chǎn)品經(jīng)理要求的萬兆流量分析指標(biāo)還有一段距離。
一天晚上,程序員的小哥哥又找我聊天。
現(xiàn)在分析能力確實(shí)提高了,但離目標(biāo)還很遠(yuǎn)快告訴我,你有什么改進(jìn)的建議嗎
是有,但我估計(jì)你還是會(huì)說改不了我翻了翻白眼
先說說吧!
現(xiàn)在這個(gè)數(shù)據(jù)包是以中斷的形式讀取的我能自己得到它而不被打斷嗎你不知道,每次中斷都要保存上下文,從用戶態(tài)切換到內(nèi)核態(tài),那么多流量,代價(jià)很大!,我興奮地說
小哥聽后沉默了。
看,我告訴過你你不能改變它!算了,趁早跟產(chǎn)品經(jīng)理說,這個(gè)需求做不了,我們倆都放心。
那不行這個(gè)項(xiàng)目對(duì)我很重要,我還指望著你升職加薪,走上人生巔峰呢!小哥說的很堅(jiān)決
如果你做不到,那就多找?guī)着_(tái)機(jī)器,復(fù)制幾份給我軟件不行,就靠硬件把性能堆出來!我沖他眨了眨眼
那還用說,老板不會(huì)同意的。
那我就毫無辦法了說實(shí)話,要處理10萬千兆的網(wǎng)絡(luò)流量,我得繞過操作系統(tǒng)我得自己從網(wǎng)卡上讀取數(shù)據(jù)包你要好好學(xué)習(xí)想升職加薪怎么會(huì)怕困難我給我的小弟弟打氣
我小哥點(diǎn)點(diǎn)頭,你說的是,我能做到。給我一點(diǎn)時(shí)間
數(shù)據(jù)面開發(fā)套件
過了一個(gè)多星期,程序員的小哥哥再也沒有來找我,我也不知道他的研究怎么樣了。
過了幾天,他終于又來了。
出來吧!我找到辦法了,明天我就開始改造你!
我聽了來了興趣,什么辦法你打算怎么改造我
這個(gè)新方案可以解決你之前提出的所有問題它允許你直接處理網(wǎng)卡,不需要中斷通知你讀取數(shù)據(jù)包,也不需要把數(shù)據(jù)包交給系統(tǒng)協(xié)議棧和netfilter框架處理
你太棒了,你能解決所有這些問題!你是怎么做到這一切的什么原理我好奇地問
小哥哥有點(diǎn)不好意思我怎么會(huì)有那本事其實(shí)這是別人開發(fā)的技術(shù)我只是用它
嗯,你弄清楚它的原理了嗎那就別坑我了!我有點(diǎn)不安
不要擔(dān)心這個(gè)這項(xiàng)技術(shù)被稱為DPDK這是英特爾開發(fā)的技術(shù)
接下來,我的小哥哥,一個(gè)程序員,給我介紹了這個(gè)叫DPDK的技術(shù)原理。
有了DPDK,UIO由操作系統(tǒng)的用戶模式驅(qū)動(dòng),我可以在用戶模式下通過輪詢讀取網(wǎng)卡的數(shù)據(jù)包,不再中斷!
在直接用戶模式讀取中,不再需要在內(nèi)核模式空間和用戶模式空間中移動(dòng)數(shù)據(jù)包看完之后我可以直接分析,不用再去翻系統(tǒng)協(xié)議棧和netfilter浪費(fèi)時(shí)間
不止如此!它還支持大頁(yè)面內(nèi)存技術(shù),我的小弟弟自豪地說。
大頁(yè)內(nèi)存這是什么
默認(rèn)情況下,系統(tǒng)不管理4KB大小的內(nèi)存頁(yè)面這個(gè)單元太小了我們的服務(wù)器內(nèi)存將會(huì)有很多內(nèi)存頁(yè)面為了管理這些頁(yè)面,會(huì)有很多頁(yè)面條目
聽到這里,我突然明白了:我知道了,如果增加這個(gè)單元,管理的內(nèi)存頁(yè)就少了,頁(yè)表項(xiàng)也少了,TLB也就不容易失效了,所以地址翻譯會(huì)更快,對(duì)吧。
沒錯(cuò)你猜,調(diào)整到多大我的小弟弟很神秘
翻倍,8KB看到小哥哥搖頭,我又猜了一下,是16KB嗎
太保守了,居然能支持2MB和1GB大小!
這么大,牛逼!
閑置問題
第二天,程序員小哥哥開始徹底重構(gòu)我。
升級(jí)后試著運(yùn)行,發(fā)現(xiàn)一個(gè)問題:如果包不多或者沒有包,我的輪詢基本就是浪費(fèi)時(shí)間,一直空轉(zhuǎn)由于我壟斷了一個(gè)核心,這個(gè)核心的占用率始終是100%,其他很多節(jié)目都吐槽我,占* *不* *的
于是,我的小哥哥程序員給我升級(jí)了,用了中斷DPDK模式:沒有包處理的時(shí)候我就睡覺了,改成中斷通知也可以和其他線程共享CPU核,不再獨(dú)占,但是DPDK線程會(huì)有更高的調(diào)度優(yōu)先級(jí)一旦包多了,我就重新?lián)Q成輪詢模式,可以靈活切換
我弟弟連續(xù)加班兩周經(jīng)過一些優(yōu)化和升級(jí),我的數(shù)據(jù)包分析和處理能力有了很大的提高
可惜幾輪測(cè)試下來,面對(duì)10Gbps流量的時(shí)候,還是有點(diǎn)不知所措,還是有點(diǎn)捉襟見肘。
弟弟有些氣餒我不知道該怎么辦了你覺得還有其他可以改進(jìn)的地方嗎
我現(xiàn)在基本上是滿負(fù)荷工作,應(yīng)該沒有提升的空間了現(xiàn)在,唯一能喘口氣的時(shí)間就是數(shù)據(jù)競(jìng)賽的時(shí)間了當(dāng)數(shù)據(jù)被鎖定時(shí),線程切換將會(huì)暫停
小哥哥想了幾秒鐘,突然眼睛一亮,高興地說:我有了!
還沒來得及問,就被關(guān)機(jī)下班了~
程序員的小哥哥要對(duì)我做什么。
免責(zé)聲明:此文內(nèi)容為本網(wǎng)站轉(zhuǎn)載企業(yè)宣傳資訊,僅代表作者個(gè)人觀點(diǎn),與本網(wǎng)無關(guān)。僅供讀者參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。




