r2p2之DPDK學習記錄(1)

2021-10-09 18:45:19 字數 1307 閱讀 9698

dpdk解決的問題是網路io的效能問題。網絡卡、cpu等硬體在高速發展,但是軟體開發卻沒有跟上節奏,使得網路io碰上瓶頸。又因為網路io實現大都需要通過核心,所以很明顯,核心是瓶頸所在。因此,提高網路io效能的方法著手點就是避開核心。

dpdk做的就是讓驅動執行在使用者態,也就是說dpdk的**大部分是放在使用者態下的。除了中斷無法在使用者態下處理,所以把處理中斷的**放在核心下。實現dpdk的基石是通過pmd驅動實現的。pmd是使用者輪詢程式,它主動詢問裝置是否需要處理。例如,它主動詢問網絡卡接受佇列是否有新的資料要接受,如果有,就取走報文進行處理,處理完畢再次迴圈。

傳統的收發包的流程是這樣,當網路裝置接受到資料時,dma模組會自動將資料儲存起來並通過中斷通知cpu來取。要傳送資料時,核心會根據系統路由器表選擇相應的網路介面進行資料傳輸,傳送完之後,網絡卡驅動程式也會啟動硬中斷通知cpu釋放資料快取區中的資料報。

而dpdk使用了pmd驅動,該驅動使用無中斷方式直接操作網絡卡的接收和傳送佇列(除了鏈路狀態通知(啥東西?)仍必須採用中斷方式以外)pmd驅動從網絡卡上接收到資料報後,會直接通過dma方式傳輸到預分配的記憶體中,同時更新無鎖環形佇列中的資料報指標,不斷輪詢的應用程式很快就能感知收到資料報,並在預分配的記憶體位址上直接處理資料報。

dpdk的工作就是對網路報文進行高速處理,而報文需要記憶體承載。但是如果每次處理報文時,還是通過頻繁地呼叫malloc和free來申請和釋放記憶體的話,那效能也優化不了多少。所以dpdk使用記憶體池來複製記憶體你申請釋放。

dpdk會將記憶體封裝在mbuf(struct rte_mbuf)結構體內。單個mbuf的結構定義如圖所示:

dpdk對網路幀的封裝是這樣:將網路幀元資料(metadata)和幀本身存放在固定大小的同一段快取中。metadata的一部分內容由dpdk的網絡卡驅動寫入。

mbuf頭部現在是佔兩個cacheline,一般是基礎性,頻繁訪問的資料放在第乙個cacheline位元組中,而將功能性擴充套件的資料放在第二個cacheline位元組中。在mbuf報頭中包含包處理所需的所有資料,如果單個mbuf存放不了,那麼mbuf的前端還有指向下乙個mbuf結構的指標(m->pkt.next)來形成幀鍊錶結構。

headroom的起始位址儲存在mbuf的buff_addr指標中。資料幀的起始指標可以通過呼叫rte_pktmbuf_mtod(mbuf)來獲得。

釋放一段mbuf實際上將其放回所屬的記憶體池,原本快取在其中的內容在被重新建立之前不會被初始化,依然儲存在其中。(那可以使用嗎?)

R語言學習記錄 2

學習如何構造r函式 難度提公升 構造統計分布 避免命名衝突 例如,定義函式f01為引數為a的指數分布的密度函式,定義f02為該指數分布的分布函式,取a 1 5,進行計算,可以看出,三種計算結果基本一致.f01 function x,a f01 5,1 5 f02 function x,a c 3 c...

2023年2月1日學習記錄

事實上,在那些不需要任何理由就能作出決定的時刻,我們的自由才會愈加明顯。然而,這並沒有值得過多詬病的地方。因為在緊急情況下,沒有理由便是最好的理由。為什麼這樣說呢?顯然,在這種情況下,我們的行為不會表現得過於膚淺和愚蠢,也不會表示出那些與自身無關且易於解釋的觀念。相反,我們的行為與我們的情感相匹配,...

CALIPSO L1B L2資料學習記錄

calipso l1b l2資料學習記錄 資料引數介紹 經度緯度 長度63555,表示該軌測量了多少組資料 垂直衰減後向散射532 28017 583,每組資料有583個bin,範圍從 2km到40km perpendicular attenuated backscatter 532,total 用...