背景
網際網路和其他網際網路必須承載的通信量在持續增長和變化。如今,實時回響的全球資訊網的廣泛使用和音頻、圖像、視頻的使用增長,驅動了服務質量需求的增長。為了應對這種增長,TCP/IP體系結構發展了QoS(服務質量)以支持各種類型的擁有各種服務質量需求的通信量。數據平面(Data Plane)是QoS框架的三平面之一,承擔了通信中分組的佇列管理,排隊調度,擁塞避免等直接在數據流上進行操作的機制,對提高網路通信的效率起著至關重要的作用。
在此基礎上,人們期望用更低的成本和更短的產品開發周期來提供多樣的網路單元與豐富的功能,如套用處理、控制處理、包處理、信號處理等。為了適應這一新的產業趨勢,基於Intel x86架構的DPDK面世了。
綜述
DPDK是一個linux基金會的開源項目。 開發DPDK的主要目的,是在數據平面套用中為快速的數據包處理提供一個簡單而完善的架構。在理解此工具集之後,開發人員可以以此為基礎進行新的原型設計,或簡單地為我所用。
DPDK架構通過創建EAL(Environment Abstraction Layer,環境抽象層)來為不同的工作環境創造函式館集,創建後開發者即可把自己的套用與函式館進行連結。該架構也包含跟蹤調試,PCIe匯流排接入等功能,並有相關樣例幫助開發者學習如何使用這些功能。
工作環境
DPDK的環境抽象層向套用與函式館隱藏了底層環境的細節,因而能擴展到任何處理器上使用。就作業系統來說,它提供了對Linux和FreeBSD的支持。
工作原理
DPDK使用了輪詢(polling)而不是中斷來處理數據包。在收到數據包時,經DPDK重載的網卡驅動不會通過中斷通知CPU,而是直接將數據包存入記憶體,交付套用層軟體通過DPDK提供的接口來直接處理,這樣節省了大量的CPU中斷時間和記憶體拷貝時間。
關鍵技術
環境抽象層
DPDK的創造的環境抽象層(EAL, Environment Abstraction Layer)主要負責對計算機底層資源(如硬體和記憶體空間)的訪問,並對提供給用戶的接口實施了實現細節的封裝。其初始化例程決定了如何分配這些資源(PCI設備、計時器、控制台等)。
EAL提供的典型服務包括:
•載入和啟動DPDK:DPDK及其應用程式會被連結為單一套用,因此需要通過某種方式進行載入DPDK。
•核關聯/分配過程:EAL提供了將執行單元分配給特定核並創建執行實例的機制。
•預留系統記憶體:EAL為預留不同的記憶體區域提供便利,例如用於設備互動的物理記憶體區域。
•抽象PCI地址:EAL提供了訪問PCI地址空間的接口。
•跟蹤和調試功能:日誌、堆疊轉儲等。
•實用的功能:libc中所沒有提供的自鏇鎖和原子計數器。
•CPU功能識別:在運行時確定CPU是否支持特定功能,確定當前CPU是否支持編譯產生的二進制指令集。
•中斷處理:向特定中斷源註冊/註銷回調的接口。
•時鐘功能:用於設定/刪除在特定時間運行的回調函式接口。
輪詢模式驅動
DPDK包括1Gb,10Gb,40Gb和半虛擬化抽象層的輪詢模式驅動(PMD, Poll Mode Driver)。PMD由用戶空間的特定的驅動程式提供的API組成,用於對設備和它們相應的佇列進行設定。拋棄了基於中斷的異步信號傳送機制為該架構帶來很大的開銷節省。避免中斷性能瓶頸是DPDK提升數據包處理速度的關鍵之一。
DPDK環境為數據包處理套用考慮了兩種模型:運行至完成(run-to-completion)模型和管道(pipeline)模型。在運行至完成模型中,一個API向某個特定連線埠的接收描述符環輪詢以接收數據包。接著這個數據包在同一個核上被處理,之後被一個傳送用API放到連線埠的傳輸描述符環上;在管道模型中,一個核心會通過API對一個或多個連線埠的接收描述符環進行輪詢,數據包通過環被接收和傳遞給另一個核心,然後在這個核心上被處理,之後可能被傳送用API放到連線埠的傳輸描述符環上。
運行至完成是一個同步模型,每個指派給DPDK的邏輯核心執行如下所示的循環:
通過PMD接收用API來提取輸出數據包
根據轉發,一一處理收到的數據包
通過PMD傳送用API傳送輸出數據包
1.通過PMD接收用API來提取輸出數據包
2.根據轉發,一一處理收到的數據包
3.通過PMD傳送用API傳送輸出數據包
相反,管道模型是一個異步模型,有的邏輯核心只執行數據包提取,而有的只執行處理,收到的數據包在這些邏輯核心之間通過環來傳遞。提取核心執行如下的循環:
通過PMD接收用API來提取輸出數據包
通過佇列提供數據包給處理核心
1.通過PMD接收用API來提取輸出數據包
2.通過佇列提供數據包給處理核心
處理核心執行如下的循環:
從佇列中提取數據包
根據重傳(如果被轉發)處理數據包
1.從佇列中提取數據包
2.根據重傳(如果被轉發)處理數據包
為了避免不必要的中斷性能瓶頸,執行環境禁止任何異步通知機制的使用。在任何需要或合適的時候,異步通信都應儘可能採用環的方式。
在多核環境中避免鎖競爭是一個重要的問題。為了處理這個問題,PMD被設計為可以儘可能地在單核私有資源下工作。例如,PMD為每個核心每個連線埠提供一個單獨的佇列。同樣的,每個連線埠的接收佇列只會被指派給唯一一個邏輯核心並接收它的輪詢。
函式館/接口
Malloc Library
提供分配任意大小記憶體的API。
Ring Library
提供對一種特殊的鍊表佇列的管理,具有先進先出、定長、無鎖、並發入/出隊等特性。
優點:工作更快,實現簡單,適用於塊數據的入/出隊;
缺點:定長、環多導致記憶體占用增加。
Mempool Library
記憶體池用於分配固定大小的對象。在DPDK中記憶體池用名字區分,並用環來存儲未使用的對象。
Mbuf Library
用於分配和釋放緩衝區給DPDK套用來存儲快取信息,使用上述的記憶體池來存儲。
IVSHMEM Library
為在虛擬機與主機或虛擬機間的零拷貝數據共享提供便利,得名於使用了QEMU的IVSHMEM機制。
Link Bonding Poll Mode Driver Library
純軟體函式館,允許多個PMD組合為單個邏輯PMD,類似於在linux中將多個網路接口組合為一個邏輯接口。
Timer Library
為DPDK執行單元提供時間服務以實現反饋函式的異步執行。時鐘有單次工作的也有周期工作的,可載入一個核心上的時鐘後在另一個上執行。時鐘提供很高的精度,也可以在編譯時禁用以提高性能。
Hash Library
創建散列表以提供快速查找功能。
LPM Library
為32位關鍵碼實現的最長前綴匹配表查找方法。用於在IP轉發套用中找到最合適的路由匹配。
LPM6 Library
即LPM for IPv6,為128位關鍵碼實現的最長前綴匹配表查找方法,用於在IPv6轉發套用中找到最合適的路由匹配。
Packet Distributor Library
用於流量的動態負載均衡問題。使用時,使用中的邏輯核心會被考慮為兩種角色:其一是一個分配器核心,負責負載均衡或數據包分配;其二是一群工人核心,負責從分配器接收數據包並對它們進行處理。
Reorder Library
用於根據序號對緩衝區重排序。套用於上述的數據包分發中。
IP Fragmentationℜassembly Library
實現IPv4和IPv6數據包的分片和重新組裝。
Vhost Library
實現用戶空間的虛擬主機驅動。同時支持vhost-cuse(字元設備)和vhost-user(套接字伺服器)。它也為客戶機中相應的半虛擬化設備創造,管理,刪除虛擬主機設備(creates, manages and destroys vhost devices for corresponding virtio devices in the guest)。
其他內容
Multiprocess Support
多進程支持。用於允許一系列DPDK進程以透明的方式同時工作在Intel架構上。
Kernel NIC Interface
核心網卡接口。允許用戶空間套用進入Linux控制平面。該接口較現有的Linux TUN/TAP接口更快,允許用標準Linux網路工具(如ethtool,ifconfig,tcpdump)對DPDK連線埠進行管理,還提供了到核心網路棧的接口。
Quality of Service Framework
QoS(服務質量)架構。包括帶QoS支持的數據包管道、分級調度(Hierarchical Scheduler)、丟包器(dropper)、流量計量(traffic metering)。
Power Management
能源管理。允許用戶空間套用通過調整CPU頻率或進入不同的C-state來節省電量。
Packet Classification&Access Control
數據包分類與準入控制。用以基於一系列規則對輸入的數據包進行分類。
Packet Framework
數據包分組架構。設計功能包括:
為建造複雜的數據包處理管道提供標準方法
為相同的管道程式塊提供在純軟體和硬體加速這兩種實現間切換的能力
在靈活性和性能間找到最佳的折中方案
提供邏輯上類似於Open Flow(SDN核心技術)的架構。
1.為建造複雜的數據包處理管道提供標準方法
2.為相同的管道程式塊提供在純軟體和硬體加速這兩種實現間切換的能力
3.在靈活性和性能間找到最佳的折中方案
4.提供邏輯上類似於Open Flow(SDN核心技術)的架構。
Port Hotplug Framework
連線埠熱插拔架構。允許DPDK套用在運行時接入和彈出連線埠。這需要核心對PCI熱插拔功能的支持。