五分鐘看懂抓包神技 DPDK

2022-01-12 06:15:34 字數 3734 閱讀 5788

我是乙個網路監控軟體,我被開發出來的使命就是監控網路中進進出出的所有通訊流量。

一直以來,我的工作都非常的出色,但是隨著我監控的網路越來越龐大,網路中的通訊流量也變得越來越多,我開始有些忙不過來了,逐漸發生丟包的現象,而且最近這一現象越發的嚴重了。

一天晚上,程式設計師哥哥把我從硬碟上叫了起來。

「這都幾點了,你怎麼還不下班啊?」,我問小哥哥。

「哎,產品經理說了,讓我下個月必須支援萬兆網路流量的分析,我這壓力可大了,沒辦法只好加班了。」,說完整理了一下自己那日益稀疏的頭髮。

「萬兆?10gbps?開玩笑呢吧?這是要累死我的節奏啊」

「可不是嗎,可愁死我了。你快給我說說,你工作這麼久了,有沒有幹的不爽的或者覺得可以改進的地方都可以給我說說」,小哥哥真誠的看著我。

我思考了片刻說到:「要說幹的不爽的,還真有!就是我現在花了太多時間在拷貝資料報了,把資料報從核心空間拷貝到使用者態空間,以前資料量小還行,現在網路流量這麼大,可真是要了我的老命了。」

小哥哥嘆了口氣,「哎,這個改不了,資料報是通過作業系統的api獲取的,作業系統又是從網絡卡那裡讀取的,咱們是工作在使用者空間的程式,必須要拷貝一次,這沒辦法。你再想想別的?」

我也嘆了口氣,「那行吧,還有乙個槽點,資料報收到後能不能直接交給我,別交給系統的協議棧和netfilter框架他們去處理了,反正我拿來後也要重新分析,每次都從他們那裡過一次,他們辦事效率又低,這不拖累我的工作嘛」

小哥哥皺著眉頭,眨了眨眼睛說到:「大兄弟,這個咱也改不了啊,我這水平也有限,我還沒有能力改造你繞過作業系統讓你直接去跟網絡卡打交道啊。要不,要不你再說乙個?嘿嘿」

「好吧,我也就不為難你了。有個簡單的問題,你可得改一下」

「什麼問題,說說看?」

小哥哥稍微思考了一下,說到:「沒問題,這個可以有!用執行緒親和性就可以搞定,給你划幾個核出來,不讓它們參與系統的執行緒排程分配,專門給你用,這事就包在我身上吧!」

過了幾天,程式設計師哥哥對我進行了公升級改造,讓我的幾個工作執行緒都能獨佔cpu核,工作效率提公升了不少。

不過,距離產品經理要求的萬兆流量分析指標,那還是差了一大截。

一天晚上,程式設計師小哥哥又找我聊了起來。

「現在分析能力確實有所提公升,不過離目標還差得遠啊,你快給我說說,還有沒有改進的建議給我啊?」

「有倒是有,但是我估計你還是會說改不了」,我翻了個白眼。

「你先說說看嘛!」

「現在這個資料報是用中斷的形式來通知讀取的,能不能不用中斷,讓我自己去取啊?你是不知道,每次中斷都要儲存上下文,從使用者態切換到核心態,那麼多流量,這開銷大了去了!」,我激動的說到。

小哥哥聽完沉默了。

「看吧,我就說你改不了吧!還是算了吧,趁早給產品經理說這個需求做不了,咱倆都輕鬆自在」

「那不行,這個專案對我非常重要,我還指望通過你來公升職加薪,走向人生巔峰呢!」,小哥哥說的很堅定。

「實在不行,那就多找幾台機器,把我copy幾份過去,軟體不行就靠硬體堆出效能嘛!」,我衝他眨了個眼睛。

「這還用你說,老闆肯定不會同意的」

「那我沒轍了,實話告訴你吧,想要我能處理萬兆網路流量,非得繞開作業系統,我親自去從網絡卡讀取資料報不可,你好好去研究下吧,想公升職加薪,怎麼能怕難呢!」,我給小哥哥打了打氣。

小哥哥點了點頭,「你說的是,我一定可以的,給我一點時間」

就這樣過了乙個多星期,程式設計師小哥哥一直沒再來找過我,也不知道他研究的怎麼樣了。

又過了好幾天,他終於又來了。

「快出來!我找到辦法了,明天就開始改造你!」

我一聽來了興趣,「什麼辦法?你打算怎麼改造我?」

「這個新方案可以解決你之前提出的所有問題,可以讓你直接去跟網絡卡打交道,不用中斷來通知讀取資料報,也不用再把資料報交給系統協議棧和netfilter框架處理,不用再頻繁的在使用者態和核心態反覆切換了!」,小哥哥越說越激動!

「你也太牛了吧,能把這些問題都解決了!你是怎麼做到這些的,什麼原理?」,我好奇的問到。

小哥哥有些不好意思,「我哪有那本事啊,其實這是別人開發的技術,我只是拿來用而已。」

「額,那你都弄清楚它的原理了嗎,別到時候坑我啊!」,我有些不太放心。

「這個你放心,這個技術叫dpdk,是人家intel開發的技術,靠譜!」

接下來,程式設計師小哥哥給我介紹了這個叫dpdk的技術原理。

有了dpdk,通過作業系統的使用者態模式驅動uio,我可以在使用者態通過輪詢的方式讀取網絡卡的資料報,再也不用中斷了!

直接在使用者態讀取,再也不用把資料報在核心態空間和使用者態空間搬來搬去。讀到了之後我直接就可以分析,還不用走系統協議棧和netfilter瞎耽誤功夫,簡直完美!

「還不止這些呢!還支援大頁記憶體技術」,小哥哥得意的說到。

「大頁記憶體?這是什麼」

「預設情況下系統不是以4kb大小來管理記憶體頁面的嗎?這個單位太小了,對於咱們伺服器記憶體會有大量的記憶體頁面,為了管理這些頁面,就會有大量的頁表項。cpu裡面進行記憶體位址翻譯的快取tlb大小有限,頁表項太多就會頻繁失效,降低記憶體位址翻譯的速度!」

「沒錯,你猜猜看,調到多大?」,小哥哥故作神秘。

「翻一倍,8kb?」,見小哥哥搖搖頭,我又猜到:「難道是16kb?」

「太保守了,能支援2mb和1gb兩種大小呢!」

「這麼大,厲害了!」

第二天,程式設計師小哥哥開始了對我進行了徹底的重構。

公升級後的我試著跑了一下,發現了乙個問題:如果資料報不是很多或者沒有資料報的情況下,我的輪詢基本上就挺浪費時間的,一直空轉,由於我獨佔了乙個核,這個核的佔用率就一直是100%,不少別的程式都吐槽我,佔著**不**。

於是,程式設計師小哥哥又對我進行了公升級,用上了interrupt dpdk模式:沒有資料報處理時就進入睡眠,改為中斷通知。還可以和其他執行緒共享cpu核,不再獨佔,但是dpd**程會有更高排程優先順序,一旦資料報多了起來,我又變成輪詢模式,可以靈活切換。

程式設計師哥哥連續加了兩個星期的班,經過一番優化公升級,我的資料報分析處理能力有了極大的提公升。

然而遺憾的是,測試了幾輪,當面臨10gbps的流量時,我還是有點力不從心,還是差了那麼一點點。

小哥哥有些灰心喪氣,「我不知道該怎麼辦了,你覺得還有什麼哪些地方可以改進嗎?」

「我現在基本滿負荷工作了,應該沒有什麼地方可以改進了。現在唯一有時間喘口氣的地方就是資料競爭的時候了,遇到資料被加了鎖發生執行緒切換歇一歇」

小哥哥思考了幾秒鐘,突然眼睛一亮,高興的說到:「有了!」

還沒來得及問,就把我關閉,下班去了~

到底程式設計師小哥哥又要對我做什麼呢?

那天,我被拉入乙個redis群聊···

cpu明明8個核,網絡卡為啥拼命折騰一號核?

因為乙個跨域請求,我差點丟了飯碗

完了!cpu一味求快出事兒了!

雜湊表哪家強?幾大程式語言吵起來了!

一分鐘看懂mysql 一分鐘,看懂易貨

從20世紀80年代開始,易貨公司在美國加拿大 澳大利亞等國興起,成為這些國家減少現金用量 增加銷售 減少庫存 開發新客戶 開闢新市場 促進經濟發展的重要產業。也成為了企業消化庫存商品 剩餘生產能力 無形資產的有效方式和在遭遇資金瓶頸時的新選擇。2015年以來,中國線下易貨店開始了矇眼狂奔,在河南南陽...

3分鐘看懂flex布局

首先要有個容器,並設定display flex display webkit flex 該容器有以下六個屬性 flex direction 元素排列方向 row,row reverse,column,column reverse flex wrap 換行 nowrap,wrap,wrap rever...

2分鐘看懂DMZ區

最近看到乙個名詞 dmz區 一直充滿疑問,今天對其進行了查詢,理解如下 1 dmz是什麼?英文全名 demilitarized zone 中文含義是 隔離區 在安全領域的具體含義是 內外網防火牆之間的區域 2 dmz做什麼?dmz區是乙個緩衝區,在dmz區存放著一些公共伺服器,比如論壇等。使用者要從...