主流包處理硬件平臺(tái)
硬件加速器:
對(duì)于本身規(guī)闹莸埽化的固化功能具有高性能低成本的特點(diǎn)。
網(wǎng)絡(luò)處理器:
提供了包處理邏輯軟件可編程能力,在獲得靈活性的同時(shí)兼具了高性能的硬件包處理。
網(wǎng)絡(luò)處理器是專(zhuān)門(mén)為處理數(shù)據(jù)包而設(shè)計(jì)的可編程通用處理器脚祟,采用多核并行處理結(jié)構(gòu),常被用于通信領(lǐng)域各種任務(wù)强饮,比如包處理由桌、協(xié)議分析、路由查找邮丰、聲音/數(shù)據(jù)的匯聚行您、防火墻、QoS等剪廉。其通用性表現(xiàn)在執(zhí)行邏輯由運(yùn)行時(shí)加載的軟件決定娃循,用戶(hù)使用專(zhuān)用指令集即微碼進(jìn)行開(kāi)發(fā)。
NPU具有高性能和高可編程性斗蒋,但不同廠商不同架構(gòu)的NPU微碼規(guī)范不盡相同捌斧,開(kāi)發(fā)人員成長(zhǎng)和社區(qū)構(gòu)建困難捧书,微碼向高級(jí)語(yǔ)言轉(zhuǎn)換效果不理想。成本和特定領(lǐng)域特性限制了NPU市場(chǎng)規(guī)模骤星。
多核處理器:
多核處理器在更為復(fù)雜多變的高層包處理上擁有優(yōu)勢(shì)经瓷,DPDK用軟件的方式在通用多核處理器上演繹著數(shù)據(jù)包處理新篇章,其為軟件定義的包處理提供了快速迭代的平臺(tái)洞难。
現(xiàn)代CPU性能的擴(kuò)展主要是通過(guò)多核的方式進(jìn)行演進(jìn)的舆吮。這樣通過(guò)處理器可以在一定程度上并行地處理網(wǎng)絡(luò)負(fù)載。由于多核處理器在邏輯復(fù)雜的協(xié)議及應(yīng)用層面上的處理優(yōu)勢(shì)队贱,以及越來(lái)越強(qiáng)勁的數(shù)據(jù)面支持能力色冀,它在多種業(yè)務(wù)領(lǐng)域得到廣泛的應(yīng)用。
CPU核以及眾多加速單元和網(wǎng)絡(luò)接口柱嫌,組成了一個(gè)片上系統(tǒng)锋恬。當(dāng)前多核處理器正在走向SoC化,針對(duì)網(wǎng)絡(luò)的SoC往往集成內(nèi)存控制器编丘、網(wǎng)絡(luò)控制器与学,甚至是一些硬件加速處理引擎。在這些SoC上嘉抓,對(duì)于可固化的處理例如索守,流分類(lèi)、QoS交由加速單元完成抑片,而對(duì)于靈活的業(yè)務(wù)邏輯則由眾多的通用處理器完成卵佛,有效融合了軟硬件各自?xún)?yōu)勢(shì)。
初識(shí)DPDK
IA多核處理器不適合數(shù)據(jù)包處理嗎敞斋?
傳統(tǒng)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)包處理:
數(shù)據(jù)包到達(dá)網(wǎng)卡設(shè)備截汪。——>網(wǎng)卡設(shè)備依據(jù)配置進(jìn)行DMA操作植捎⊙媒猓——>網(wǎng)卡發(fā)送中斷,喚醒處理器鸥跟《迹——>? ? 驅(qū)動(dòng)軟件填充讀寫(xiě)緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)∫阶桑——>數(shù)據(jù)報(bào)文到達(dá)內(nèi)核協(xié)議棧枫匾,進(jìn)行高層處理∧饣矗——>如果最終應(yīng)用在用戶(hù)態(tài)干茉,數(shù)據(jù)從內(nèi)核搬移到用戶(hù)態(tài)。 / 如果最終應(yīng)用在內(nèi)核態(tài)很泊,在內(nèi)核繼續(xù)進(jìn)行角虫。
原先每個(gè)報(bào)文就會(huì)觸發(fā)一個(gè)中斷沾谓,隨著網(wǎng)絡(luò)接口帶寬從千兆向萬(wàn)兆邁進(jìn),大量數(shù)據(jù)到來(lái)觸發(fā)頻繁的中斷戳鹅,系統(tǒng)無(wú)法承受中斷帶來(lái)的開(kāi)銷(xiāo)均驶。因此,有人在Linux內(nèi)核引入NAPI機(jī)制用于高吞吐場(chǎng)景——系統(tǒng)被中斷喚醒后枫虏,盡量使用輪詢(xún)的方式一次處理多個(gè)數(shù)據(jù)包妇穴,直到網(wǎng)絡(luò)再次空閑轉(zhuǎn)入中斷等待。
在TCP/IP模型中隶债,網(wǎng)絡(luò)包進(jìn)入計(jì)算機(jī)大多需要經(jīng)過(guò)協(xié)議處理腾它,在Linux系統(tǒng)中TCP/IP由Linux內(nèi)核處理。在不需要協(xié)議處理的場(chǎng)景下死讹,也需要把包從內(nèi)核緩沖區(qū)復(fù)制到用戶(hù)緩沖區(qū)瞒滴,系統(tǒng)調(diào)用以及數(shù)據(jù)包復(fù)制的開(kāi)銷(xiāo)會(huì)直接影響用戶(hù)態(tài)應(yīng)用從設(shè)備直接獲取包的能力。而對(duì)于多樣的網(wǎng)絡(luò)功能節(jié)點(diǎn)來(lái)說(shuō)赞警,TCP/IP協(xié)議棧不是數(shù)據(jù)轉(zhuǎn)發(fā)節(jié)點(diǎn)所必需的妓忍。如何讓面向控制面原生設(shè)計(jì)的操作系統(tǒng)如Linux,在包處理上減少不必要的開(kāi)銷(xiāo)是一大熱點(diǎn)仅颇。Netmap单默,一個(gè)高性能網(wǎng)絡(luò)I/O框架,采用共享數(shù)據(jù)包池的方式忘瓦,減少內(nèi)核到用戶(hù)空間的包復(fù)制。
NAPI和Netmap兩方面的努力已經(jīng)明顯改善了傳統(tǒng)Linux系統(tǒng)上包處理能力引颈,DPDK如何去做得更好耕皮,怎樣的軟件設(shè)計(jì)能充分釋放IA的包處理能力呢?
DPDK最佳實(shí)踐
DPDK很好地回答了IA多核處理器應(yīng)對(duì)高性能數(shù)據(jù)包處理的問(wèn)題蝙场。其大致的技術(shù)可以歸納如下:輪詢(xún)凌停、用戶(hù)態(tài)驅(qū)動(dòng)、親和性與獨(dú)占售滤、降低訪(fǎng)存開(kāi)銷(xiāo)罚拟、軟件調(diào)優(yōu)、利用IA新硬件技術(shù)完箩、充分挖掘網(wǎng)卡的潛能赐俗。
DPDK框架簡(jiǎn)介
內(nèi)核態(tài)模塊
KNI ( Kernel NIC interface 內(nèi)核網(wǎng)卡接口)是DPDK允許用戶(hù)態(tài)和內(nèi)核態(tài)交換報(bào)文的渠道,KNI 模擬虛擬的網(wǎng)口弊知,提供 DPDK 應(yīng)用程序和 Linux 內(nèi)核直接通信鏈接阻逮, 即 KNI 接口允許報(bào)文從用戶(hù)態(tài)接收后轉(zhuǎn)發(fā)到 Linux 內(nèi)核協(xié)議棧中。
IGB_UIO內(nèi)核模塊秩彤。DPDK 利用 Linux 提供的UIO機(jī)制叔扼,通過(guò)read()感知中斷事哭、mmap()實(shí)現(xiàn)和網(wǎng)卡設(shè)備的通信,在 Linux 內(nèi)核中安裝 igb_uio.ko 模塊(代替網(wǎng)卡驅(qū)動(dòng)模塊)瓜富,重設(shè)中斷回調(diào)函數(shù)入口參數(shù)鳍咱,當(dāng)網(wǎng)卡與 igb_uio.ko 綁定后,igb_uio接管網(wǎng)卡与柑,并為用戶(hù)態(tài)PMD 提供服務(wù)接口流炕。
用戶(hù)態(tài)模塊
Core Libraries 核心部件庫(kù)
核心部件庫(kù)是 DPDK 面向用戶(hù)態(tài)協(xié)議棧程序開(kāi)發(fā)的模塊,如:VPP 就是基于 DPDK的核心庫(kù)接口實(shí)現(xiàn)的用戶(hù)態(tài)協(xié)議棧應(yīng)用仅胞。
EAL (Environment Abstraction Layer 環(huán)境抽象層)每辟, 對(duì) DPDK 的運(yùn)行環(huán)境進(jìn)行初始化,包括:HugePage 內(nèi)存分配干旧、內(nèi)存/緩沖區(qū)/隊(duì)列分配渠欺、原子性無(wú)鎖操作、NUMA 親和性椎眯、CPU 綁定等挠将,并通過(guò) UIO 或 VFIO 技術(shù)將 PCI/PCIe 設(shè)備地址映射到用戶(hù)態(tài),方便用戶(hù)態(tài)的 DPDK 應(yīng)用程序調(diào)用编整。同時(shí)為應(yīng)用程序提供通用接口舔稀,隱藏與底層庫(kù)、設(shè)備交換的相關(guān)細(xì)節(jié)掌测。
MALLOC (堆內(nèi)存管理組件)内贮,為DPDK應(yīng)用程序提供從 HugePage 內(nèi)、分配內(nèi)存的接口汞斧,當(dāng)需要為skb_buf (Socket Buffer 數(shù)據(jù)包緩沖區(qū))分配大量的小塊內(nèi)存時(shí)夜郁,可調(diào)用此接口。由于堆內(nèi)存是從 HugePage 內(nèi)存分配的粘勒,所以可以減少 TLB 缺頁(yè)竞端。堆、是由開(kāi)發(fā)人員主動(dòng)分配和釋放的存儲(chǔ)空間庙睡,如果開(kāi)發(fā)人員不釋放事富,則程序結(jié)束時(shí)由 OS 回收,分配方式類(lèi)似于鏈表乘陪;與堆不同统台,棧是由操作系統(tǒng)自動(dòng)分配和釋放的存儲(chǔ)空間,用于存儲(chǔ)函數(shù)的參數(shù)值暂刘、局部變量等饺谬。
MBUF (網(wǎng)絡(luò)報(bào)文緩存塊管理組件), 為 DPDK 應(yīng)用程序提供創(chuàng)建和釋放、數(shù)據(jù)報(bào)文信息緩存塊的接口募寨。 提供兩種類(lèi)型的 MBUF族展,一種存儲(chǔ)一般信息、一種存儲(chǔ)時(shí)間的報(bào)文數(shù)據(jù)拔鹰;這些 MBUF 存儲(chǔ)在一個(gè)內(nèi)存池中仪缸。
MEMPOOL (內(nèi)存池管理組件),為 DPDK 應(yīng)用程序和其他組件提供分配內(nèi)存池的接口列肢,內(nèi)存池是一個(gè)由固定大小的多個(gè)內(nèi)存塊組成的內(nèi)存容器恰画,可用于存儲(chǔ)不同的對(duì)象實(shí)體,如: 數(shù)據(jù)報(bào)文緩存塊等瓷马。內(nèi)存池是由一個(gè)字符串進(jìn)行唯一標(biāo)識(shí)拴还,它由一個(gè)Ring 緩沖區(qū)和一組本地緩存隊(duì)列組成,每個(gè)CPU core 優(yōu)先從自身的緩存隊(duì)列中分配內(nèi)存塊欧聘,當(dāng)本地緩存隊(duì)列減少到一定程度時(shí)片林,開(kāi)始從內(nèi)存環(huán)緩沖區(qū)中申請(qǐng)內(nèi)存塊進(jìn)行補(bǔ)充。
RING (環(huán)緩沖區(qū)管理組件)怀骤, 為DPDK應(yīng)用程序和其他組件提供一個(gè)無(wú)鎖的多生產(chǎn)者费封、多消費(fèi)者的FIFO緩沖區(qū)隊(duì)列。DPDK 基于 Linux 內(nèi)核的無(wú)鎖環(huán)形緩沖 kfifo 實(shí)現(xiàn)一套自己的無(wú)鎖機(jī)制蒋伦、 RING 環(huán)緩存區(qū)管理組件弓摘,支持單生產(chǎn)者/單消費(fèi)者、多生產(chǎn)者/多消費(fèi)者入列出列的操作痕届,在數(shù)據(jù)傳輸時(shí)韧献、降低性能的同時(shí)還能保住數(shù)據(jù)的同步。
TIMER (定時(shí)器組件)爷抓,提供一些異步周期執(zhí)行的接口势决,可以指定某個(gè)函數(shù)在規(guī)定時(shí)間內(nèi)的異步執(zhí)行,就像LIBC 中的 timer 定時(shí)器蓝撇。但是這里的定時(shí)器需要 DPDK 應(yīng)用程序在主循環(huán)中周期調(diào)用 rte_timer_manage 來(lái)使能定時(shí)器,使用起來(lái)不是那么方便陈莽。
Extensions 擴(kuò)展內(nèi)容
KNI,主要通過(guò) Linux 內(nèi)核中的 kni.ko 模塊將數(shù)據(jù)報(bào)文從用戶(hù)態(tài)傳遞給內(nèi)核態(tài)的協(xié)議棧處理渤昌,以便常規(guī)的用戶(hù)進(jìn)程可以使用Linux 內(nèi)核協(xié)議棧、處理傳統(tǒng)的 Socket 接口報(bào)文走搁。
POWER, 讓 DPDK 應(yīng)用程序可以根據(jù)收?qǐng)?bào)速率独柑、動(dòng)態(tài)調(diào)整CPU頻率、或讓CPU 進(jìn)入不同的休眠狀態(tài)私植。
IVSHMEM, 模塊提供虛擬機(jī)與虛擬機(jī)間忌栅、或虛擬機(jī)與主機(jī)之間的零拷貝共享內(nèi)存機(jī)制,當(dāng) DPDK 應(yīng)用程序運(yùn)行時(shí)、IVSHMEM 模塊會(huì)調(diào)用 Core Libraries 的 API 索绪,把幾個(gè)HugePage 內(nèi)存映射為一個(gè) IVSHMEM 設(shè)備池湖员,并通過(guò)參數(shù)傳遞給 QEMU ,通過(guò)此方法實(shí)現(xiàn)虛擬機(jī)間的零拷貝共享內(nèi)存瑞驱。
PMD-Natives&Virtual 用戶(hù)態(tài)輪詢(xún)模式的網(wǎng)卡驅(qū)動(dòng)程序
以太網(wǎng)輪詢(xún)模式驅(qū)動(dòng)架構(gòu)娘摔,把以太網(wǎng)驅(qū)動(dòng)從內(nèi)核移動(dòng)到應(yīng)用層,采用同步輪詢(xún)機(jī)制而不是內(nèi)核態(tài)的異步中斷機(jī)制來(lái)提高報(bào)文的接收和發(fā)送效率唤反。
Classify 報(bào)文轉(zhuǎn)發(fā)分類(lèi)算法庫(kù)
支持精確匹配 (Exact Match)凳寺、最長(zhǎng)匹配 (LPM)和 通配符匹配 (ACL)數(shù)據(jù)報(bào)文,并提供常用的包處理的查表操作彤侍。
Qos 調(diào)度和流控庫(kù)
提供網(wǎng)絡(luò)服務(wù)質(zhì)量相關(guān)的組件肠缨,如:限速 (Meter) 和調(diào)度 (Scheduler),調(diào)度庫(kù)支持隨機(jī)早檢測(cè)盏阶、流量整形晒奕、嚴(yán)格優(yōu)先級(jí)、和加權(quán)隨機(jī)循環(huán)優(yōu)先級(jí)調(diào)度等般哼。