因特網(wǎng)和其他互聯(lián)網(wǎng)必須承載的通信量在持續(xù)增長和變化。如今,實時響應(yīng)的萬維網(wǎng)的廣泛使用和音頻、圖像、視頻的使用增長,驅(qū)動了服務(wù)質(zhì)量需求的增長。為了應(yīng)對這種增長,TCP/IP體系結(jié)構(gòu)發(fā)展了QoS(服務(wù)質(zhì)量)以支持各種類型的擁有各種服務(wù)質(zhì)量需求的通信量。數(shù)據(jù)平面(Data Plane)是QoS框架的三平面之一,承擔(dān)了通信中分組的隊列管理,排隊調(diào)度,擁塞避免等直接在數(shù)據(jù)流上進(jìn)行操作的機制,對提高網(wǎng)絡(luò)通信的效率起著至關(guān)重要的作用。[1]
在此基礎(chǔ)上,人們期望用更低的成本和更短的產(chǎn)品開發(fā)周期來提供多樣的網(wǎng)絡(luò)單元與豐富的功能,如應(yīng)用處理、控制處理、包處理、信號處理等。為了適應(yīng)這一新的產(chǎn)業(yè)趨勢,基于Intel x86架構(gòu)的DPDK面世了。
DPDK是一個linux基金會的開源項目。開發(fā)DPDK的主要目的,是在數(shù)據(jù)平面應(yīng)用中為快速的數(shù)據(jù)包處理提供一個簡單而完善的架構(gòu)。在理解此工具集之后,開發(fā)人員可以以此為基礎(chǔ)進(jìn)行新的原型設(shè)計,或簡單地為我所用。
DPDK架構(gòu)通過創(chuàng)建EAL(Environment Abstraction Layer,環(huán)境抽象層)來為不同的工作環(huán)境創(chuàng)造函數(shù)庫集,創(chuàng)建后開發(fā)者即可把自己的應(yīng)用與函數(shù)庫進(jìn)行鏈接。該架構(gòu)也包含跟蹤調(diào)試,PCIe總線接入等功能,并有相關(guān)樣例幫助開發(fā)者學(xué)習(xí)如何使用這些功能。
DPDK的環(huán)境抽象層向應(yīng)用與函數(shù)庫隱藏了底層環(huán)境的細(xì)節(jié),因而能擴(kuò)展到任何處理器上使用。就操作系統(tǒng)來說,它提供了對Linux和FreeBSD的支持。
DPDK使用了輪詢(polling)而不是中斷來處理數(shù)據(jù)包。在收到數(shù)據(jù)包時,經(jīng)DPDK重載的網(wǎng)卡驅(qū)動不會通過中斷通知CPU,而是直接將數(shù)據(jù)包存入內(nèi)存,交付應(yīng)用層軟件通過DPDK提供的接口來直接處理,這樣節(jié)省了大量的CPU中斷時間和內(nèi)存拷貝時間。
DPDK的創(chuàng)造的環(huán)境抽象層(EAL, Environment Abstraction Layer)主要負(fù)責(zé)對計算機底層資源(如硬件和內(nèi)存空間)的訪問,并對提供給用戶的接口實施了實現(xiàn)細(xì)節(jié)的封裝。其初始化例程決定了如何分配這些資源(PCI設(shè)備、計時器、控制臺等)。
EAL提供的典型服務(wù)包括:
DPDK包括1Gb,10Gb,40Gb和半虛擬化抽象層的輪詢模式驅(qū)動(PMD, Poll Mode Driver)。PMD由用戶空間的特定的驅(qū)動程序提供的API組成,用于對設(shè)備和它們相應(yīng)的隊列進(jìn)行設(shè)置。拋棄了基于中斷的異步信號發(fā)送機制為該架構(gòu)帶來很大的開銷節(jié)省。避免中斷性能瓶頸是DPDK提升數(shù)據(jù)包處理速度的關(guān)鍵之一。
DPDK環(huán)境為數(shù)據(jù)包處理應(yīng)用考慮了兩種模型:運行至完成(run-to-completion)模型和管道(pipeline)模型。在運行至完成模型中,一個API向某個特定端口的接收描述符環(huán)輪詢以接收數(shù)據(jù)包。接著這個數(shù)據(jù)包在同一個核上被處理,之后被一個發(fā)送用API放到端口的傳輸描述符環(huán)上;在管道模型中,一個核心會通過API對一個或多個端口的接收描述符環(huán)進(jìn)行輪詢,數(shù)據(jù)包通過環(huán)被接收和傳遞給另一個核心,然后在這個核心上被處理,之后可能被發(fā)送用API放到端口的傳輸描述符環(huán)上。
運行至完成是一個同步模型,每個指派給DPDK的邏輯核心執(zhí)行如下所示的循環(huán):
相反,管道模型是一個異步模型,有的邏輯核心只執(zhí)行數(shù)據(jù)包提取,而有的只執(zhí)行處理,收到的數(shù)據(jù)包在這些邏輯核心之間通過環(huán)來傳遞。提取核心執(zhí)行如下的循環(huán):
處理核心執(zhí)行如下的循環(huán):
為了避免不必要的中斷性能瓶頸,執(zhí)行環(huán)境禁止任何異步通知機制的使用。在任何需要或合適的時候,異步通信都應(yīng)盡可能采用環(huán)的方式。
在多核環(huán)境中避免鎖競爭是一個重要的問題。為了處理這個問題,PMD被設(shè)計為可以盡可能地在單核私有資源下工作。例如,PMD為每個核心每個端口提供一個單獨的隊列。同樣的,每個端口的接收隊列只會被指派給唯一一個邏輯核心并接收它的輪詢。
提供分配任意大小內(nèi)存的API。
內(nèi)存池用于分配固定大小的對象。在DPDK中內(nèi)存池用名字區(qū)分,并用環(huán)來存儲未使用的對象。
為在虛擬機與主機或虛擬機間的零拷貝數(shù)據(jù)共享提供便利,得名于使用了QEMU的IVSHMEM機制。
為DPDK執(zhí)行單元提供時間服務(wù)以實現(xiàn)反饋函數(shù)的異步執(zhí)行。時鐘有單次工作的也有周期工作的,可載入一個核心上的時鐘后在另一個上執(zhí)行。時鐘提供很高的精度,也可以在編譯時禁用以提高性能。
創(chuàng)建散列表以提供快速查找功能。
為32位關(guān)鍵碼實現(xiàn)的最長前綴匹配表查找方法。用于在IP轉(zhuǎn)發(fā)應(yīng)用中找到最合適的路由匹配。
即LPM for IPv6,為128位關(guān)鍵碼實現(xiàn)的最長前綴匹配表查找方法,用于在IPv6轉(zhuǎn)發(fā)應(yīng)用中找到最合適的路由匹配。
用于流量的動態(tài)負(fù)載均衡問題。使用時,使用中的邏輯核心會被考慮為兩種角色:其一是一個分配器核心,負(fù)責(zé)負(fù)載均衡或數(shù)據(jù)包分配;其二是一群工人核心,負(fù)責(zé)從分配器接收數(shù)據(jù)包并對它們進(jìn)行處理。
用于根據(jù)序號對緩沖區(qū)重排序。應(yīng)用于上述的數(shù)據(jù)包分發(fā)中。
實現(xiàn)IPv4和IPv6數(shù)據(jù)包的分片和重新組裝。
實現(xiàn)用戶空間的虛擬主機驅(qū)動。同時支持vhost-cuse(字符設(shè)備)和vhost-user(套接字服務(wù)器)。它也為客戶機中相應(yīng)的半虛擬化設(shè)備創(chuàng)造,管理,刪除虛擬主機設(shè)備(creates, manages and destroys vhost devices for corresponding virtio devices in the guest)。
多進(jìn)程支持。用于允許一系列DPDK進(jìn)程以透明的方式同時工作在Intel架構(gòu)上。
內(nèi)核網(wǎng)卡接口。允許用戶空間應(yīng)用進(jìn)入Linux控制平面。該接口較現(xiàn)有的Linux TUN/TAP接口更快,允許用標(biāo)準(zhǔn)Linux網(wǎng)絡(luò)工具(如ethtool,ifconfig,tcpdump)對DPDK端口進(jìn)行管理,還提供了到內(nèi)核網(wǎng)絡(luò)棧的接口。
QoS(服務(wù)質(zhì)量)架構(gòu)。包括帶QoS支持的數(shù)據(jù)包管道、分級調(diào)度(Hierarchical Scheduler)、丟包器(dropper)、流量計量(traffic metering)。
能源管理。允許用戶空間應(yīng)用通過調(diào)整CPU頻率或進(jìn)入不同的C-state來節(jié)省電量。
數(shù)據(jù)包分類與準(zhǔn)入控制。用以基于一系列規(guī)則對輸入的數(shù)據(jù)包進(jìn)行分類。
數(shù)據(jù)包分組架構(gòu)。設(shè)計功能包括:
端口熱插拔架構(gòu)。允許DPDK應(yīng)用在運行時接入和彈出端口。這需要內(nèi)核對PCI熱插拔功能的支持。
聯(lián)系客服