DPDK?架構(gòu)和關(guān)鍵技術(shù)
概念和術(shù)語
隨著互聯(lián)網(wǎng)的高速發(fā)展、云產(chǎn)業(yè)的快速突起,?基礎(chǔ)架構(gòu)網(wǎng)絡(luò)逐漸偏向基于通用計算平臺或模塊化計算平臺的架構(gòu)融合,以支持多樣化和大數(shù)據(jù)下的網(wǎng)絡(luò)功能,?傳統(tǒng)的?PC?機器在分布式計算平臺上的優(yōu)勢更為明顯。在這些針對海量數(shù)據(jù)處理或海量用戶的服務(wù)場景,高性能編程顯得尤為重要。?DPDK?應(yīng)運而生。
DPDK?英文全稱為?Data Plane Development Kit,DPDK?是一套源碼編程庫,或者可以說是一個開源的數(shù)據(jù)平面開發(fā)工具集,可以為?Intel?Architecture(IA)處理器架構(gòu)下用戶空間高效的數(shù)據(jù)包處理提供庫函數(shù)和驅(qū)動的支持,它不同于Linux?系統(tǒng)以通用性設(shè)計為目的,而是專注于網(wǎng)絡(luò)應(yīng)用中數(shù)據(jù)包的高性能處理。
DPDK?通過環(huán)境抽象層旁路內(nèi)核協(xié)議棧、輪詢模式的報文無中斷收發(fā)、優(yōu)化內(nèi)存/緩沖區(qū)/隊列管理、基于網(wǎng)卡多隊列和流識別的負載均衡等多項技術(shù),實現(xiàn)了在?x86?處理器架構(gòu)下的高性能報文轉(zhuǎn)發(fā)能力,目前已經(jīng)驗證可以運行在大多數(shù)???Linux?操作系統(tǒng)上,包括?FreeBSD?9.2、Fedora?release18、Ubuntu?12.04?LTS、?RedHat Enterprise Linux 6.3?和?Suse Enterprise Linux?11 SP2?等。?DPDK?使??用了?BSD?License,極大的方便了企業(yè)在其基礎(chǔ)上來實現(xiàn)自己的協(xié)議棧或者應(yīng)用。?用戶可以在?Linux?用戶態(tài)空間開發(fā)各類高速轉(zhuǎn)發(fā)應(yīng)用,也適合與各類商業(yè)化的數(shù)據(jù)平面加速解決方案進行集成。
英特爾在?2010?年啟動了對?DPDK?技術(shù)的開源化進程,?于當年?9?月通過?BSD?開?源許可協(xié)議正式發(fā)布源代碼軟件包,并于?2014 年?4 在?www.dpdk.org?上正式成立了獨立的開源社區(qū)平臺,?為開發(fā)者提供支持。開源社區(qū)的參與者們大幅推進了DPDK?的技術(shù)創(chuàng)新和快速演進,而今它已發(fā)展成為?SDN?和NFV?的一項關(guān)鍵技術(shù)。
主要術(shù)語:
DPDK:Data?Plane?Development?Kit,DPDK?是一套源碼編程庫,?可以為?Intel處理器提升基礎(chǔ)數(shù)據(jù)平面功能。
FreeBSD:FreeBSD?是一種?UNIX?操作系統(tǒng),是由經(jīng)過?BSD、386BSD?和?4.4BSD?發(fā)展而來的?Unix?的一個重要分支。?FreeBSD 為不同架構(gòu)的計算機系統(tǒng)提供了不?同程度的支持。它是一個自由的(英文?free?也可以說是免費的)類?UNIX?操作系統(tǒng)?(Unix-like),經(jīng)由 BSD UNIX 由?AT&T UNIX?衍生而來,F(xiàn)reeBSD 由于法律原因不?能稱為?UNIX,但由于直接衍生于?BSD?UNIX,并且一些原來?BSD?UNIX?的開發(fā)者后?來轉(zhuǎn)到?FreeBSD?的開發(fā),使得?FreeBSD?在內(nèi)部結(jié)構(gòu)和系統(tǒng)?API?上和?UNIX?有很大的兼容性。
KNI:Kernel?NIC?Interface?是?DPDK?提供的一種允許用戶空間應(yīng)用程序訪問的?Linux?協(xié)議棧的接口,類似于?linux?的TUN/TAP。
UIO:linux Userspace I/O?子系統(tǒng),是運行在用戶空間的?I/O?技術(shù)。Linux系統(tǒng)中一般的驅(qū)動設(shè)備都是運行在內(nèi)核空間,?而在用戶空間用應(yīng)用程序調(diào)用即可,?而?UIO?則是將驅(qū)動的很少一部分運行在內(nèi)核空間,?而在用戶空間實現(xiàn)驅(qū)動的絕大多數(shù)功能。使用?UIO?可以避免設(shè)備的驅(qū)動程序需要隨著內(nèi)核的更新而更新的問題。
VFIO:Virtual?Function?I/O?是一套用戶態(tài)驅(qū)動框架,?VFIO 由平臺無關(guān)的接?口層與平臺相關(guān)的實現(xiàn)層組成,?它提供兩種基本服務(wù):?向用戶態(tài)提供訪問硬件設(shè)備的接口、向用戶態(tài)提供配置?IOMMU?的接口。
DPDK架構(gòu)介紹
DPDK?的組成架構(gòu)如下圖所示,在最底部的內(nèi)核態(tài)(Linux Kernel)DPDK 有?兩個模塊:KNI?與?IGB_UIO。其中,?KNI 提供給用戶一個使用?Linux?內(nèi)核態(tài)的協(xié)?議棧,以及傳統(tǒng)的?Linux?網(wǎng)絡(luò)工具(如?ethtool,?ifconfig)。IGB_UIO(igb_uio.ko?和?kni.ko.?IGB_UIO)則借助了?UIO 技術(shù), 在初始化過程中將網(wǎng)卡硬件寄存器映射到用戶態(tài)。

DPDK?的上層用戶態(tài)由很多庫組成,主要包括核心部件庫(Core?Libraries)、?平臺相關(guān)模塊(Platform)、網(wǎng)卡輪詢模式驅(qū)動模塊(PMD-Natives&Virtual)、?QoS 庫、報文轉(zhuǎn)發(fā)分類算法(Classify)等幾大類, 用戶應(yīng)用程序可以使用這些
庫進行二次開發(fā),下面分別簡要介紹。
核心部件庫:該模塊構(gòu)成的運行環(huán)境是建立在?Linux 上,通過環(huán)境抽象層 ?(EAL)的運行環(huán)境進行初始化,?包括:?HugePage?內(nèi)存分配、內(nèi)存/緩沖區(qū)/隊列分 配與無鎖操作、CPU?親和性綁定等;?其次,?EAL 實現(xiàn)了對操作系統(tǒng)內(nèi)核與底層網(wǎng)卡?I/O 操作的屏蔽(I/O?旁路了內(nèi)核及其協(xié)議棧)?,為?DPDK 應(yīng)用程序提供了一?組調(diào)用接口,通過?UIO 或?VFIO 技術(shù)將?PCI 設(shè)備地址映射到用戶空間,方便了??應(yīng)用程序調(diào)用,?避免了網(wǎng)絡(luò)協(xié)議棧和內(nèi)核切換造成的處理延遲。另外,?核心部件還包括創(chuàng)建適合報文處理的內(nèi)存池、緩沖區(qū)分配管理、內(nèi)存拷貝、以及定時器、環(huán)形緩沖區(qū)管理等。
平臺相關(guān)模塊:其內(nèi)部模塊主要包括?KNI、能耗管理以及?IVSHMEM 接口。其?中,KNI 模塊主要通過?kni.ko 模塊將數(shù)據(jù)報文從用戶態(tài)傳遞給內(nèi)核態(tài)協(xié)議棧處?理,以便用戶進程使用傳統(tǒng)的?socket?接口對相關(guān)報文進行處理;能耗管理則提?供了一些?API,應(yīng)用程序可以根據(jù)收包速率動態(tài)調(diào)整處理器頻率或進入處理器的?不同休眠狀態(tài);?另外,IVSHMEM?模塊提供了虛擬機與虛擬機之間,?或者虛擬機與?主機之間的零拷貝共享內(nèi)存機制,當?DPDK?程序運行時,?IVSHMEM?模塊會調(diào)用核心部件庫?API,把幾個?HugePage?映射為一個?IVSHMEM?設(shè)備池,并通過參數(shù)傳遞給?QEMU,這樣,就實現(xiàn)了虛擬機之間的零拷貝內(nèi)存共享。
輪詢模式驅(qū)動模塊:PMD?相關(guān)?API?實現(xiàn)了在輪詢方式下進行網(wǎng)卡報文收發(fā),?避免了常規(guī)報文處理方法中因采用中斷方式造成的響應(yīng)延遲,?極大提升了網(wǎng)卡收?發(fā)性能。此外,?該模塊還同時支持物理和虛擬化兩種網(wǎng)絡(luò)接口,?從僅僅支持?Intel?網(wǎng)卡,發(fā)展到支持?Cisco、Broadcom、Mellanox、Chelsio?等整個行業(yè)生態(tài)系統(tǒng),以及基于?KVM、VMWARE、 XEN?等虛擬化網(wǎng)絡(luò)接口的支持。
DPDK?還定義了大量?API?來抽象數(shù)據(jù)平面的轉(zhuǎn)發(fā)應(yīng)用,如?ACL、QoS、流分類?和負載均衡等。并且,除以太網(wǎng)接口外,?DPDK?還在定義用于加解密的軟硬件加速接口(Extensions)。
總體而言,DPDK?技術(shù)具有如下特征:
(1)采用 BSD License,保證了可合法用于商業(yè)產(chǎn)品
(2)支持?RedHat、CentOS、Fedora、Ubuntu?等大多數(shù)?Linux?系統(tǒng),已開始進入主流?Linux?發(fā)布版本。
(3)DPDK?支持?Run?to?Completion?和?Pipeline?兩種報文處理模式,用戶可以依據(jù)需求靈活選擇,或者混合使用。Run?to?Completion?是一種水平調(diào)度方式,利用網(wǎng)卡的多隊列,將報文分發(fā)給多個?CPU?核處理,每個核均獨立處理到達該隊?列的報文,資源分配相對固定,?減少了報文在核間的傳遞開銷,?可以隨著核的數(shù)?目靈活擴展處理能力;Pipeline?模式則通過共享環(huán)在核間傳遞數(shù)據(jù)報文或消息,將系統(tǒng)處理任務(wù)分解到不同的?CPU?核上處理,?通過任務(wù)分發(fā)來減少處理等待時延。
(4)DPDK?的庫函數(shù)和樣例程序十分豐富,包括?L2/L3?轉(zhuǎn)發(fā)、Hash、 ACL、QoS?等大量示例供用戶參考,具體可訪問http://dpdk.org/doc/guides/sample_app_ug/index.html
大頁技術(shù)
x86?處理器硬件在缺省配置下,?頁的大小是?4K,但也可以支持更大的頁表尺?寸,?例如?2M?或?1G?的頁表。使用了大頁表功能后,?一個?TLB?表項可以指向更大的?內(nèi)存區(qū)域,這樣可以大幅減少?TLB miss?的發(fā)生。早期的?Linux?并沒有利用?x86 硬件提供的大頁表功能,僅在?Linux 內(nèi)核?2.6.33 以后的版本,應(yīng)用軟件才可以?使用大頁表功能,具體的介紹可以參見?Linux?的大頁表文件系統(tǒng)(hugetlbfs)特性。
DPDK?則利用大頁技術(shù),所有的內(nèi)存都是從?HugePage?里分配,實現(xiàn)對內(nèi)存池(mempool)的管理,并預(yù)先分配好同樣大小的?mbuf,供每一個數(shù)據(jù)包使用。
輪詢技術(shù)
為了減少中斷處理開銷,DPDK?使用了輪詢技術(shù)來處理網(wǎng)絡(luò)報文。網(wǎng)卡收到報?文后,直接將報文保存到處理器?cache 中(有?DDIO(Direct Data I/O)技術(shù)的?情況下),或者保存到內(nèi)存中(沒有?DDIO?技術(shù)的情況下),并設(shè)置報文到達的?標志位。應(yīng)用軟件則周期性地輪詢報文到達的標志位,檢測是否有新報文需要處?理。整個過程中完全沒有中斷處理過程,?因此應(yīng)用程序的網(wǎng)絡(luò)報文處理能力得以極大提升。
CUP親和技術(shù)
CPU?親和技術(shù),就是將某個進程或者線程綁定到特定的一個或者多個核上執(zhí)行,而不被遷移到其它核上運行,這樣就保證了專用程序的性能。
DPDK?使用了?Linux?pthread?庫,?在系統(tǒng)中把相應(yīng)的線程和?CPU?進行親和性綁定, 然后相應(yīng)的線程盡可能使用獨立的資源進行相關(guān)的數(shù)據(jù)處理。
DPDK的應(yīng)用模型

DPDK技術(shù)應(yīng)用優(yōu)勢
(1)提供高性能網(wǎng)絡(luò)處理能力。
(2)友好的商業(yè)許可證。
(3)Intel 主推,業(yè)界比較認可,產(chǎn)品可靠性和穩(wěn)定性較高。
(4)主流網(wǎng)卡廠商基本都有支持。
(5)支持?KVM\XEN\Vmware?等主流虛擬化平臺。
DPDK初始化和轉(zhuǎn)發(fā)流程
在?Host?上運行用戶態(tài)?EVS,借助于?DPDK?的網(wǎng)卡管理?API?和大頁內(nèi)存,來提升物理網(wǎng)卡收發(fā)包性能和處理能力。
虛擬機啟動時,在?XML 中配置為?vhost-usr?類型虛擬網(wǎng)卡,?qemu?保證vhost-usr?后端驅(qū)動可以直接訪問大頁內(nèi)存中的報文。
用戶態(tài)?EVS?和?vhost-user?后端驅(qū)動之間通過共享收發(fā)隊列的內(nèi)存來傳遞報文,利用批處理、輪詢機制和多核轉(zhuǎn)發(fā)提升報文處理能力。
初始化流程
在創(chuàng)建?vswitch?實例時,支持創(chuàng)建用戶態(tài)?EVS?類型,通過?dpdk?高速數(shù)據(jù)通道從物理網(wǎng)卡收包,然后批量轉(zhuǎn)發(fā),將報文交給?VM?虛擬網(wǎng)卡后端驅(qū)動?vhost-user,?再交給?VM?虛擬網(wǎng)卡;或者從?VM?虛擬網(wǎng)卡后端驅(qū)動?vhost-user?收包,然后批量轉(zhuǎn)發(fā),將報文交給物理網(wǎng)卡,物理網(wǎng)卡將報文發(fā)送出去。
批量轉(zhuǎn)發(fā)流程
初始化完成后,在轉(zhuǎn)發(fā)線程內(nèi)進行輪詢,遍歷當前線程所服務(wù)的每個端口,?嘗試接收一組報文,然后對每個報文做轉(zhuǎn)發(fā)判斷,找到目的端口后暫時存放在該目的端口的緩存數(shù)組中,當前端口的這些報文都處理結(jié)束后,再處理下一個端口。期間如果某個目的端口的緩存數(shù)組已滿,則直接刷新發(fā)送出去。