您當前的位置:首頁 > 舞蹈

DPDK框架核心介紹

作者:由 Linux百里 發表于 舞蹈時間:2021-08-26

推薦影片:搞定DPDK技術精髓

1、傳統網路架構

傳統的網路裝置(交換機、路由器等)為了快速處理資料包而嵌入了NP處理器(Network Process),內建硬體電路實現高速轉發資料包。隨著雲計算的發展以CPU為核心、作業系統是linux,網路裝置都是虛擬化,沒有NP處理器。雲計算需要高速的處理資料包的要求。傳統的網路架構處理流程如下:

DPDK框架核心介紹

傳統網路框架處理流程

傳統網路框架處理流程中沒有控制層面和資料層面之分,大部分的處理都是在核心中完成。傳統網路架構的劣勢如下:

當收到大量資料包就會頻繁產生硬體中斷,硬體中斷就會打斷優先順序較低的軟體中斷,從而存在頻繁的切換損耗效能。

網絡卡收到資料包在核心經過協議棧處理要複製到應用層緩衝區,這樣的複製很耗時間,據統計這個複製的時間佔資料包處理 流程時間的57。1%。

頻繁到達的硬體中斷和軟中斷都可能隨時搶佔系統呼叫的執行,這會產生大量的上下文切換開銷。另外,在基於多執行緒的伺服器設計框架中,執行緒間的排程也會產生頻繁的上下文切換開銷,同樣,鎖競爭的耗能也是一個非常嚴重的問題。

如今主流的處理器都是多個核心的,這意味著一個數據包的處理可能跨多個 CPU 核心,比如一個數據包可能中斷在 cpu0,核心態處理在 cpu1,使用者態處理在 cpu2,這樣跨多個核心,容易造成 CPU 快取失效,造成區域性性失效。如果是 NUMA 架構,更會造成跨 NUMA 訪問記憶體,效能受到很大影響。

傳統伺服器記憶體頁為 4K,為了提高記憶體的訪問速度,避免 cache miss,可以增加 cache 中對映表的條目,但這又會影響 CPU 的檢索效率。

2、dpdk

dpdk 全稱data plane development kit(資料平面轉發工具),為 Intel 處理器架構下使用者空間高效的資料包處理提供了庫函式和驅動的支援,資料包的控制層和資料層分開,dpdk繞過linux核心協議棧將資料包的接受處理放到應用層。

DPDK框架核心介紹

dpdk處理流程圖

DPDK攔截中斷,不觸發後續中斷流程,並繞過協議棧,透過UIO技術將網絡卡收到的報文複製到應用層處理,報文不再經過核心協議棧。減少了中斷,DPDK的包全部在使用者控制元件使用記憶體池管理,核心控制元件與使用者空間的記憶體互動不用進行複製,只做控制權轉移,減少報文複製過程,提高報文的轉發效率。

DPDK框架核心介紹

dpdk框架圖

如上圖所示dpkd總體框架圖,底層透過UIO技術來實現使用者態和核心態的資料包互動,然後將資料包的控制器交給應用層的應用程式處理,dpdk只是一個框架它提供各種功能庫比如:MEMORY、RING、MBUF、PDM、MEMPOOL,這些接下來會分析。

dpkd主要有以下核心技術:

1.UIO

UIO是使用者空間的一種I/O技術,dpdk 能夠繞過核心協議棧,本質上是得益於 UIO 技術,透過 UIO 能夠攔截中斷,並重設中斷回撥行為,從而繞過核心協議棧後續的處理流程。

UIO 裝置的實現機制其實是對使用者空間暴露檔案介面,比如當註冊一個 UIO 裝置 uioX,就會出現檔案 /dev/uioX,對該檔案的讀寫就是對裝置記憶體的讀寫。除此之外,對裝置的控制還可以透過 /sys/class/uio 下的各個檔案的讀寫來完成。

DPDK框架核心介紹

2.記憶體池技術

dpdk 在使用者空間實現了一套精巧的記憶體池技術,核心空間和使用者空間的記憶體互動不進行複製,只做控制權轉移。這樣,當收發資料包時,就減少了記憶體複製的開銷。

3.大頁記憶體分配

dpdk 實現了一組大頁記憶體分配、使用和釋放的 API,上層應用可以很方便使用 API 申請使用大頁記憶體,同時也相容普通的記憶體申請,透過更大的記憶體頁(如1G記憶體頁),減少TLB(Translation Lookaside Buffer,即快表) Miss,Miss對報文轉發效能影響很大。

4.無鎖迴圈佇列

dpdk 基於 Linux 核心的無鎖環形緩衝 kfifo 實現了自己的一套無鎖機制。支援單生產者入列/單消費者出列和多生產者入列/多消費者出列操作,在資料傳輸的時候,降低效能的同時還能保證資料的同步。

5.PDM

DPDK網絡卡驅動完全拋棄中斷模式,基於輪詢方式收包,避免了中斷開銷,簡稱PDM。

6.NUMA

dpdk 記憶體分配上透過 proc 提供的記憶體資訊,使 CPU 核心儘量使用靠近其所在節點的記憶體,避免了跨 NUMA 節點遠端訪問記憶體的效能問題。

7.CPU親和力

dpdk 利用 CPU 的親和性將一個執行緒或多個執行緒繫結到一個或多個 CPU 上,這樣線上程執行過程中,就不會被隨意排程,一方面減少了執行緒間的頻繁切換帶來的開銷,另一方面避免了 CPU 快取的區域性失效性,增加了 CPU 快取的命中率。

DPDK將網絡卡接收佇列分配給某個CPU核,該佇列收到的報文都交給該核上的DPDK執行緒處理。存在兩種方式將資料包傳送到接收佇列之上:

RSS(Receive Side Scaling,接收方擴充套件)機制:根據關鍵字,比如根據UDP的四元組進行雜湊

Flow Director機制:可設定根據資料包某些資訊進行精確匹配,分配到指定的佇列與CPU核

DPDK框架核心介紹

執行緒繫結CPU

當網路資料包(幀)被網絡卡接收後,DPDK網絡卡驅動將其儲存在一個高效緩衝區中,並在MBUF快取中建立MBUF物件與實際網路包相連,對網路包的分析和處理都會基於該MBUF,必要的時候才會訪問緩衝區中的實際網路包。

8.多核排程框架

dpdk 基於多核架構,一般會有主從核之分,主核負責完成各個模組的初始化,從核負責具體的業務處理。

3、dpdk核心元件

核心元件

指一系列的庫,用於為高效能包處理程式提供所有必須的元素。核心元件及其之間的關係如下圖所示

DPDK框架核心介紹

dpdk核心元件

(1)環形緩衝區管理(librte_ring)

Ring資料結構提供了一個無鎖的多生產者,多消費者的FIFO表處理介面。 他比無鎖佇列優異的地方在於它容易部署,適合大量的操作,而且更快。 Ring庫在 Memory Pool Manager (librte_mempool)中使用到, 而且ring還用於不同核之間或是邏輯核上處理單元之間的通訊。

(2)記憶體池管理(librte_mempool)

記憶體池管理的主要職責就是在記憶體中分配指定數目物件的POOL。 每個POOL以名稱來唯一標識,並且使用一個ring來儲存空閒的物件節點。 它還提供了一些其他的服務如物件節點的每核備份快取及自動對齊以保證元素能均衡的處於每核記憶體通道上。

(3) 網路報文緩衝區管理(librte_mbuf)

報文快取管理器提供了建立、釋放報文快取的能力,DPDK應用程式中可能使用這些報文快取來儲存訊息。 而訊息通常在程式開始時透過DPDK的MEMPOOL庫建立並存儲。 BUFF庫提供了報文申請釋放的API,通常訊息buff用於快取普通訊息,報文buff用於快取網路報文。

(4)定時器管理(librte_timer)

這個庫位DPDK執行單元提供了定時服務,為函式非同步執行提供支援。 定時器可以設定週期呼叫或只調用一次。 使用EAL提供的介面獲取高精度時鐘,並且能在每個核上根據需要初始化。

(5)乙太網輪詢驅動架構

DPDK的PMD驅動支援1G、10G、40G。 同時DPDK提供了虛擬的乙太網控制器,被設計成非非同步,基於中斷的模式。

(6)報文轉發演算法支援

DPDK提供了雜湊(librte_hash)、最長字首匹配的(librte_lpm)演算法庫用於支援包轉發。

(7)網路協議庫(librte_net)

這個庫提供了IP協議的一些定義,以及一些常用的宏。 這些定義都基於FreeBSD IP協議棧的程式碼,並且包含相關的協議號,IP相關宏定義,IPV4和IPV6頭部結構等等。

推薦:

C/C++Linux伺服器開發/高階架構師 系統性學習地址

歡迎朋友們加入C/C++Linux學習交流群:960994558

群內提供免費的C/C++Linux伺服器開發/高階架構師學習資料資料包括C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg等)

DPDK框架核心介紹

標簽: 記憶體  資料包  報文  DPDK  CPU