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

DPDK的基本原理

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

網路裝置(路由器、交換機、媒體閘道器、SBC、PS閘道器等)需要在瞬間進行大量的報文收發,因此在傳統的網路裝置上,往往能夠看到專門的NP(Network Process)處理器,有的用FPGA,有的用ASIC。這些專用器件透過內建的硬體電路(或透過程式設計形成的硬體電路)高效轉發報文,只有需要對報文進行深度處理的時候才需要CPU干涉。

但在公有云、NFV等應用場景下,基礎設施以CPU為運算核心,往往不具備專用的NP處理器,作業系統也以通用Linux為主,網路資料包的收發處理路徑如下圖所示:

DPDK的基本原理

在虛擬化環境中,路徑則會更長

DPDK的基本原理

由於包處理任務存在核心態與使用者態的切換,以及多次的記憶體複製,系統消耗變大,以CPU為核心的系統存在很大的處理瓶頸。為了提升在通用伺服器(COTS)的資料包處理效能,Intel推出了服務於IA(Intel Architecture)系統的DPDK技術。

DPDK是Data Plane Development Kit的縮寫。簡單說,DPDK應用程式執行在作業系統的User Space,利用自身提供的資料面庫進行收發包處理,繞過了Linux核心態協議棧,以提升報文處理效率。

DPDK是一組lib庫和工具包的集合。最簡單的架構描述如下圖所示:

DPDK的基本原理

上圖藍色部分是DPDK的主要元件(更全面更權威的DPDK架構可以參考Intel官網),簡單解釋一下:

PMD:Pool Mode Driver,輪詢模式驅動,透過非中斷,以及資料幀進出應用緩衝區記憶體的零複製機制,提高發送/接受資料幀的效率

流分類:Flow Classification,為N元組匹配和LPM(最長字首匹配)提供最佳化的查詢演算法

環佇列:Ring Queue,針對單個或多個數據包生產者、單個數據包消費者的出入佇列提供無鎖機制,有效減少系統開銷

MBUF緩衝區管理:分配記憶體建立緩衝區,並透過建立MBUF物件,封裝實際資料幀,供應用程式使用

EAL:Environment Abstract Layer,環境抽象(適配)層,PMD初始化、CPU核心和DPDK執行緒配置/繫結、設定HugePage大頁記憶體等系統初始化

這麼說可能還有一點點抽象,再總結一下DPDK的核心思想:

使用者態模式的PMD驅動,去除中斷,避免核心態和使用者態記憶體複製,減少系統開銷,從而提升I/O吞吐能力

使用者態有一個好處,一旦程式崩潰,不至於導致核心完蛋,帶來更高的健壯性

HugePage,透過更大的記憶體頁(如1G記憶體頁),減少TLB(Translation Lookaside Buffer,即快表) Miss,Miss對報文轉發效能影響很大

多核裝置上建立多執行緒,每個執行緒繫結到獨立的物理核,減少執行緒排程的開銷。同時每個執行緒對應著獨立免鎖佇列,同樣為了降低系統開銷

向量指令集,提升CPU流水線效率,降低記憶體等待開銷

下圖簡單描述了DPDK的多佇列和多執行緒機制:

DPDK的基本原理

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

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

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

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

DPDK的基本原理

以上就是DPDK的基礎知識,關於如何在應用程式中使用DPDK,以及系統應該如何針對報文收發的成熟最佳化方式,後面一邊學習與實踐,一邊記錄。

推薦自己的Linux、C/C++技術交流群:【960994558】整理了一些個人覺得比較好的學習書籍、大廠面試題、和熱門技術教學影片資料共享在裡面(包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK等等。),有需要的可以自行新增哦!~

DPDK的基本原理

以上有不足的地方歡迎指出討論,覺得不錯的朋友希望能得到您的轉發支援,同時可以持續關注我,每天分享Linux C/C++後臺開發乾貨內容!

標簽: DPDK  資料包  CPU  報文  佇列