一、DPDK簡介
DPDK(Data Plane Development Kit)是一個開源的數(shù)據(jù)平面開發(fā)工具包,它提供了一組C語言庫和驅(qū)動程序,用于快速開發(fā)高性能的數(shù)據(jù)平面應(yīng)用程序。DPDK使用用戶空間的方式來實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包處理,從而避免了傳統(tǒng)內(nèi)核態(tài)和用戶態(tài)之間頻繁切換導(dǎo)致的性能損失。
DPDK支持多種硬件平臺和操作系統(tǒng),并且在各種場景下都表現(xiàn)出優(yōu)異的性能。例如,在云計算、電信、金融、在線游戲等行業(yè)中,DPDK被廣泛應(yīng)用于高速網(wǎng)絡(luò)數(shù)據(jù)處理、虛擬化網(wǎng)絡(luò)功能和SDN等方面。
二、DPDK的主要目的
DPDK的主要目的是提供一種快速、高效、靈活的數(shù)據(jù)平面開發(fā)框架,幫助開發(fā)人員輕松構(gòu)建高性能的網(wǎng)絡(luò)應(yīng)用程序。
具體來說,DPDK致力于解決以下問題:
1. 提高數(shù)據(jù)包處理性能:通過使用用戶空間和優(yōu)化算法等技術(shù)手段,DPDK顯著提升了數(shù)據(jù)包處理性能,可以達(dá)到數(shù)百萬pps(每秒數(shù)據(jù)包數(shù))的級別。
2. 支持多種硬件平臺和操作系統(tǒng):DPDK支持多種常見硬件平臺和操作系統(tǒng),并且可以與其他開源項目(如Open vSwitch、OpenStack等)集成使用。
3. 提供易用的API:DPDK提供了一組易用的C語言API,使得開發(fā)人員可以輕松地編寫高性能的網(wǎng)絡(luò)應(yīng)用程序。
4. 支持各種場景下的應(yīng)用:由于其高性能和靈活性,DPDK被廣泛應(yīng)用于云計算、電信、金融、在線游戲等行業(yè)中,涉及到高速網(wǎng)絡(luò)數(shù)據(jù)處理、虛擬化網(wǎng)絡(luò)功能和SDN等方面。
三、工作環(huán)境
DPDK的環(huán)境抽象層向應(yīng)用與函數(shù)庫隱藏了底層環(huán)境的細(xì)節(jié),因而能擴(kuò)展到任何處理器上使用。就操作系統(tǒng)來說,它提供了對Linux和FreeBSD的支持。
還不熟悉的朋友,這里可以先領(lǐng)取一份dpdk新手學(xué)習(xí)資料包(入坑不虧):
掃碼領(lǐng)取DPDK新手學(xué)習(xí)資料包
(包含技術(shù)介紹教程、技術(shù)代碼和文檔資料)
就市場而言,隨著業(yè)務(wù)量用戶量的增長,會有越來越多的公司用到dpdk,而學(xué)好dpdk也會成為你進(jìn)軍優(yōu)秀的互聯(lián)網(wǎng)公司甚至大廠的一個方向。關(guān)于dpdk的學(xué)習(xí)他不同與java偏業(yè)務(wù),更多的是重視你對底層技術(shù)的理解,對計算機(jī)原理基礎(chǔ)的學(xué)習(xí)程度以及你的學(xué)歷。
一句話形容:與業(yè)務(wù)關(guān)聯(lián)不大,與底層技術(shù)關(guān)系較大。
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工作原理:
初始化:在應(yīng)用程序啟動時,DPDK初始化了所有需要的硬件設(shè)備、線程和內(nèi)存池等資源,并且為每個CPU核心分配一個獨(dú)立的運(yùn)行環(huán)境。
接收數(shù)據(jù):當(dāng)一個數(shù)據(jù)包到達(dá)網(wǎng)卡時,DPDK會將其緩存在一個環(huán)形緩沖區(qū)中,并通知應(yīng)用程序有新數(shù)據(jù)到達(dá)。
數(shù)據(jù)包分類:應(yīng)用程序根據(jù)預(yù)定義的規(guī)則對數(shù)據(jù)包進(jìn)行分類(例如流量監(jiān)控、負(fù)載均衡、安全檢查等),并將它們發(fā)送到相應(yīng)的隊列中。
數(shù)據(jù)包處理:DPDK從隊列中取出待處理的數(shù)據(jù)包,并使用用戶空間驅(qū)動程序(userspace driver)進(jìn)行數(shù)據(jù)包解析、協(xié)議轉(zhuǎn)換和業(yè)務(wù)邏輯處理等操作。
數(shù)據(jù)包發(fā)送:完成處理后,DPDK將結(jié)果重新打包成網(wǎng)絡(luò)報文,并通過網(wǎng)卡發(fā)送回網(wǎng)絡(luò)中。
回收資源:當(dāng)應(yīng)用程序不再需要某些資源時,DPDK會將它們釋放回內(nèi)存池或者硬件設(shè)備中,以便其他線程或者進(jìn)程使用。
由于采用軟件轉(zhuǎn)發(fā)和軟件交換技術(shù),單服務(wù)器內(nèi)部的轉(zhuǎn)發(fā)能力是 NFV 系統(tǒng)的主要性能瓶頸。在各類高速轉(zhuǎn)發(fā)的 NFV 應(yīng)用中,數(shù)據(jù)報文從網(wǎng)卡中接收,再傳送到虛擬化的用戶態(tài)應(yīng)用程序(VNF)處理,整個過程要經(jīng)歷 CPU 中斷處理、虛擬化 I/O 與地址映射轉(zhuǎn)換、虛擬交換層、網(wǎng)絡(luò)協(xié)議棧、內(nèi)核上下文切換、內(nèi)存拷貝等多個費(fèi)時的 CPU 操作和 I/O 處理環(huán)節(jié)。
業(yè)內(nèi)通常采用消除海量中斷、旁路內(nèi)核協(xié)議棧、減少內(nèi)存拷貝、CPU 多核任務(wù)分擔(dān)、Intel VT 等技術(shù)來綜合提升服務(wù)器數(shù)據(jù)平面的報文處理性能,普通用戶較難掌握。業(yè)界迫切需要一種綜合的性能優(yōu)化方案,同時提供良好的用戶開發(fā)和商業(yè)集成環(huán)境,DPDK 加速技術(shù)方案成為其中的典型代表。
DPDK 是一個開源的數(shù)據(jù)平面開發(fā)工具集,提供了一個用戶空間下的高效數(shù)據(jù)包處理庫函數(shù),它通過環(huán)境抽象層旁路內(nèi)核協(xié)議棧、輪詢模式的報文無中斷收發(fā)、優(yōu)化內(nèi)存/緩沖區(qū)/ 隊列管理、基于網(wǎng)卡多隊列和流識別的負(fù)載均衡等多項技術(shù),實現(xiàn)了在 x86 處理器架構(gòu)下的高性能報文轉(zhuǎn)發(fā)能力,用戶可以在 Linux 用戶態(tài)空間開發(fā)各類高速轉(zhuǎn)發(fā)應(yīng)用,也適合與各類商業(yè)化的數(shù)據(jù)平面加速解決方案進(jìn)行集成。
英特爾在 2010 年啟動了對 DPDK 技術(shù)的開源化進(jìn)程,于當(dāng)年 9 月通過 BSD 開源許可協(xié)議正式發(fā)布源代碼軟件包,為開發(fā)者提供支持。開源社區(qū)的參與者們大幅推進(jìn)了 DPDK 的技術(shù)創(chuàng)新和快速演進(jìn), 而今它已發(fā)展成為 SDN 和 NFV 的一項關(guān)鍵技術(shù)。
基于 OS 內(nèi)核的數(shù)據(jù)傳輸有什么弊端
中斷處理。當(dāng)網(wǎng)絡(luò)中大量數(shù)據(jù)包到來時,會產(chǎn)生頻繁的硬件中斷請求,這些硬件中斷可以打斷之前較低優(yōu)先級的軟中斷或者系統(tǒng)調(diào)用的執(zhí)行過程,如果這種打斷頻繁的話,將會產(chǎn)生較高的性能開銷。
內(nèi)存拷貝。正常情況下,一個網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)卡到應(yīng)用程序需要經(jīng)過如下的過程:數(shù)據(jù)從網(wǎng)卡通過 DMA 等方式傳到內(nèi)核開辟的緩沖區(qū),然后從內(nèi)核空間拷貝到用戶態(tài)空間,在 Linux 內(nèi)核協(xié)議棧中,這個耗時操作甚至占到了數(shù)據(jù)包整個處理流程的 57.1%。
上下文切換。頻繁到達(dá)的硬件中斷和軟中斷都可能隨時搶占系統(tǒng)調(diào)用的運(yùn)行,這會產(chǎn)生大量的上下文切換開銷。另外,在基于多線程的服務(wù)器設(shè)計框架中,線程間的調(diào)度也會產(chǎn)生頻繁的上下文切換開銷,同樣,鎖競爭的耗能也是一個非常嚴(yán)重的問題。
局部性失效。如今主流的處理器都是多個核心的,這意味著一個數(shù)據(jù)包的處理可能跨多個 CPU 核心,比如一個數(shù)據(jù)包可能中斷在 cpu0,內(nèi)核態(tài)處理在 cpu1,用戶態(tài)處理在 cpu2,這樣跨多個核心,容易造成 CPU 緩存失效,造成局部性失效。如果是 NUMA 架構(gòu),更會造成跨 NUMA 訪問內(nèi)存,性能受到很大影響。
內(nèi)存管理。傳統(tǒng)服務(wù)器內(nèi)存頁為 4K,為了提高內(nèi)存的訪問速度,避免 cache miss,可以增加 cache 中映射表的條目,但這又會影響 CPU 的檢索效率。
針對這些問題,可探討的技術(shù)點(diǎn):
控制層和數(shù)據(jù)層分離。將數(shù)據(jù)包處理、內(nèi)存管理、處理器調(diào)度等任務(wù)轉(zhuǎn)移到用戶空間去完成,而內(nèi)核僅僅負(fù)責(zé)部分控制指令的處理。這樣就不存在上述所說的系統(tǒng)中斷、上下文切換、系統(tǒng)調(diào)用、系統(tǒng)調(diào)度等等問題。
使用多核編程技術(shù)代替多線程技術(shù),并設(shè)置 CPU 的親和性,將線程和 CPU 核進(jìn)行一比一綁定,減少彼此之間調(diào)度切換。
針對 NUMA 系統(tǒng),盡量使 CPU 核使用所在 NUMA 節(jié)點(diǎn)的內(nèi)存,避免跨內(nèi)存訪問。
使用大頁內(nèi)存代替普通的內(nèi)存,減少 cache-miss。
采用無鎖技術(shù)解決資源競爭問題。
DPDK 的組成架構(gòu)如下圖所示,相關(guān)技術(shù)原理概述如下:
圖中,在最底部的內(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)用程序可以使用這些庫進(jìn)行二次開發(fā),下面分別簡要介紹。
UIO(Linux Userspace I/O) 提供應(yīng)用空間下驅(qū)動程序的支持,也就是說網(wǎng)卡驅(qū)動是運(yùn)行在用戶空間的,減下了報文在用戶空間和應(yīng)用空間的多次拷貝。如圖:DPDK繞過了Linux內(nèi)核的網(wǎng)絡(luò)驅(qū)動模塊,直接從網(wǎng)絡(luò)硬件到達(dá)用戶空間,不需要進(jìn)行頻繁的內(nèi)存拷貝和系統(tǒng)調(diào)用。根據(jù)官方給出的數(shù)據(jù),DPDK裸包反彈每個包需要80個時鐘周期,而傳統(tǒng)Linux內(nèi)核協(xié)議棧每包需要2k~4k個時鐘周期。DPDK能顯著提升虛擬化網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)采集效率。
UIO技術(shù)的工作原理:
UIO技術(shù)將設(shè)備驅(qū)動分為用戶空間驅(qū)動和內(nèi)核空間驅(qū)動兩部分,內(nèi)核空間驅(qū)動主要負(fù)責(zé)設(shè)備資源分配、UIO設(shè)備注冊以及小部分中斷響應(yīng)函數(shù),驅(qū)動的大部分工作在用戶空間的驅(qū)動程序下完成。通過UIO框架提供的API接口將UIO的驅(qū)動注冊到內(nèi)核,注冊完成后將生成存有設(shè)備物理地址等信息的map文件,用戶態(tài)進(jìn)程訪問該文件將設(shè)備對應(yīng)的內(nèi)存空間地址映射到用戶空間,即可直接操作設(shè)備的內(nèi)存空間,UIO技術(shù)使得應(yīng)用程序可以通過用戶空間驅(qū)動直接操作設(shè)備的內(nèi)存空間,避免了數(shù)據(jù)在內(nèi)核緩沖區(qū)和應(yīng)用程序緩沖區(qū)的多次拷貝,提供數(shù)據(jù)處理效率。
簡單地說,DPDK使高速數(shù)據(jù)包網(wǎng)絡(luò)應(yīng)用程序的開發(fā)變得更快,這意味著它允許構(gòu)建能夠更快地處理數(shù)據(jù)包的應(yīng)用程序,這多虧了內(nèi)核的繞過。實際上,它使用了快速路徑,而不是正常的網(wǎng)絡(luò)層路徑和上下文切換路徑。包被直接傳遞到用戶空間(作為原始包)。如下圖為linux內(nèi)核包處理和dpdk包處理的區(qū)別。
slow路徑和fast路徑比較
核心部件庫
該模塊構(gòu)成的運(yùn)行環(huán)境是建立在 Linux 上,通過環(huán)境抽象層(EAL)的運(yùn)行環(huán)境進(jì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ū)管理等。
DPDK主要有六個核心組件:
1、 環(huán)境抽象層(EAL):為DPDK其他組件和應(yīng)用程序提供一個屏蔽具體平臺特性的統(tǒng)一接口,環(huán)境抽象層提供的功能主要有:DPDK加載和啟動;支持多核和多線程執(zhí)行類型;CPU核親和性處理;原子操作和鎖操作接口;時鐘參考;PCI總線訪問接口;跟蹤和調(diào)試接口;CPU特性采集接口;中斷和告警接口等。
2、 堆內(nèi)存管理組件(Malloc lib):堆內(nèi)存管理組件為應(yīng)用程序提供從大頁內(nèi)存分配對內(nèi)存的接口。當(dāng)需要分配大量內(nèi)存小塊時,使用這些接口可以減少TLB缺頁。
3、 環(huán)緩沖區(qū)管理組件(Ring lib):環(huán)緩沖區(qū)管理組件為應(yīng)用程序和其他組件提供一個無鎖的多生產(chǎn)者多消費(fèi)者FIFO隊列API:Ring。Ring是借鑒了Linux內(nèi)核kfifo無鎖隊列,可以無鎖出入對,支持多消費(fèi)/生產(chǎn)者同時出入隊。
4、 內(nèi)存池管理組件(Mem pool lib):為應(yīng)用程序和其他組件提供分配內(nèi)存池的接口,內(nèi)存池是一個由固定大小的多個內(nèi)存塊組成的內(nèi)存容器,可用于存儲相同對象實體,如報文緩存塊等。內(nèi)存池由內(nèi)存池的名稱來唯一標(biāo)識,它由一個環(huán)緩沖區(qū)和一組核本地緩存隊列組成,每個核從自己的緩存隊列分配內(nèi)存塊,當(dāng)本地緩存隊列減少到一定程度時,從內(nèi)存緩沖區(qū)中申請內(nèi)存塊來補(bǔ)充本地隊列。
5、網(wǎng)絡(luò)報文緩存塊管理組件(Mbuf lib):提供應(yīng)用程序創(chuàng)建和釋放用于存儲報文信息的緩存塊的接口,這些MBUF存儲在內(nèi)存池中。提供兩種類型的MBUF,一種用于存儲一般信息,一種用于存儲報文信息。
6、 定時器組件(Timer lib):提供一些異步周期執(zhí)行的接口(也可以只執(zhí)行一次),可以指定某個函數(shù)在規(guī)定的時間異步的執(zhí)行,就像LIBC中的timer定時器,但是這里的定時器需要應(yīng)用程序在主循環(huán)中周期調(diào)用rte_timer_manage來使定時器得到執(zhí)行。定時器組件的時間參考來自EAL層提供的時間接口。
除了以上六個核心組件外,DPDK還提供以下功能:
1) 以太網(wǎng)輪詢模式驅(qū)動(PMD)架構(gòu):把以太網(wǎng)驅(qū)動從內(nèi)核移到應(yīng)用層,采用同步輪詢機(jī)制而不是內(nèi)核態(tài)的異步中斷機(jī)制來提高報文的接收和發(fā)送效率。
2)報文轉(zhuǎn)發(fā)算法支持:Hash 庫和LPM庫為報文轉(zhuǎn)發(fā)算法提供支持。
3) 網(wǎng)絡(luò)協(xié)議定義和相關(guān)宏定義:基于FreeBSD IP協(xié)議棧的相關(guān)定義如:TCP、UDP、SCTP等協(xié)議頭定義。
4)報文QOS調(diào)度庫:支持隨機(jī)早檢測、流量整形、嚴(yán)格優(yōu)先級和加權(quán)隨機(jī)循環(huán)優(yōu)先級調(diào)度等相關(guān)QOS 功能。
5)內(nèi)核網(wǎng)絡(luò)接口庫(KNI):提供一種DPDK應(yīng)用程序與內(nèi)核協(xié)議棧的通信的方法、類似普通Linux的TUN/TAP接口,但比TUN/TAP接口效率高。每個物理網(wǎng)口可以虛擬出多個KNI接口。
平臺相關(guān)模塊
其內(nèi)部模塊主要包括 KNI、能耗管理以及 IVSHMEM 接口。其中,KNI 模塊主要通過 kni.ko 模塊將數(shù)據(jù)報文從用戶態(tài)傳遞給內(nèi)核態(tài)協(xié)議棧處理,以便用戶進(jìn)程使用傳統(tǒng)的 socket 接口對相關(guān)報文進(jìn)行處理;能耗管理則提供了一些API,應(yīng)用程序可以根據(jù)收包速率動態(tài)調(diào)整處理器頻率或進(jìn)入處理器的不同休眠狀態(tài);另外,IVSHMEM 模塊提供了虛擬機(jī)與虛擬機(jī)之間,或者虛擬機(jī)與主機(jī)之間的零拷貝共享內(nèi)存機(jī)制,當(dāng) DPDK 程序運(yùn)行時,IVSHMEM 模塊會調(diào)用核心部件庫 API,把幾個 HugePage 映射為一個 IVSHMEM 設(shè)備池,并通過參數(shù)傳遞給 QEMU,這樣,就實現(xiàn)了虛擬機(jī)之間的零拷貝內(nèi)存共享。
用戶空間輪詢模式(PMD)
傳統(tǒng)中斷模式:傳統(tǒng)Linux系統(tǒng)中,當(dāng)網(wǎng)絡(luò)設(shè)備檢測到數(shù)據(jù)幀過來的時候,會使用DMA(直接內(nèi)存訪問)將幀發(fā)送到預(yù)先分配好的內(nèi)核緩沖區(qū)里面,然后更新相應(yīng)的接收描述符環(huán),之后產(chǎn)生中斷通知有數(shù)據(jù)幀過來。Linux系統(tǒng)會進(jìn)行相應(yīng)的響應(yīng),然后更新相應(yīng)的描述符環(huán),再將接收到的數(shù)據(jù)幀交給內(nèi)核中的網(wǎng)絡(luò)堆棧進(jìn)行處理,網(wǎng)絡(luò)堆棧處理完之后會將相應(yīng)的數(shù)據(jù)拷貝到相應(yīng)的套接字,從而數(shù)據(jù)就被復(fù)制到了用戶空間,應(yīng)用程序就可以使用這些數(shù)據(jù)了,數(shù)據(jù)幀的接收過程如圖:
數(shù)據(jù)幀的接收過程
在發(fā)送的時候,一旦用戶程序處理完了數(shù)據(jù),會通過一個系統(tǒng)調(diào)用將數(shù)據(jù)寫入到套接字,將數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間的緩沖區(qū),交由網(wǎng)絡(luò)堆棧進(jìn)行處理,網(wǎng)絡(luò)堆棧根據(jù)需要對數(shù)據(jù)進(jìn)行封裝并調(diào)用網(wǎng)卡設(shè)備的驅(qū)動程序,網(wǎng)卡設(shè)備驅(qū)動程序會更新傳輸描述符環(huán),然后向網(wǎng)卡設(shè)備告知有數(shù)據(jù)幀需要傳輸。網(wǎng)卡設(shè)備會將數(shù)據(jù)幀從內(nèi)核中的緩沖區(qū)拷貝到自己的緩沖區(qū)中并發(fā)送到網(wǎng)絡(luò)鏈路上,傳送到鏈路上之后,網(wǎng)卡設(shè)備會通過一個中斷告知成功發(fā)送,然后內(nèi)核會釋放相應(yīng)的緩沖區(qū)。
數(shù)據(jù)的發(fā)送如圖:
由于linux系統(tǒng)是通過中斷的方式告知CPU有數(shù)據(jù)包過來的,當(dāng)網(wǎng)絡(luò)的流量越來越大,linux系統(tǒng)會浪費(fèi)越來越多的時間去處理中斷,當(dāng)流量速率達(dá)到10G的時候,linux系統(tǒng)可能會被中斷淹沒,浪費(fèi)很多CPU資源。
DPDK用戶空間的輪詢模式驅(qū)動:用戶空間驅(qū)動使得應(yīng)用程序不需要經(jīng)過linux內(nèi)核就可以訪問網(wǎng)絡(luò)設(shè)備卡。網(wǎng)卡設(shè)備可以通過DMA方式將數(shù)據(jù)包傳輸?shù)绞孪确峙浜玫木彌_區(qū),這個緩沖區(qū)位于用戶空間,應(yīng)用程序通過不斷輪詢的方式可以讀取數(shù)據(jù)包并在原地址上直接處理,不需要中斷,而且也省去了內(nèi)核到應(yīng)用層的數(shù)據(jù)包拷貝過程。
因此相對于linux系統(tǒng)傳統(tǒng)中斷方式,Intel DPDK避免了中斷處理、上下文切換、系統(tǒng)調(diào)用、數(shù)據(jù)復(fù)制帶來的性能上的消耗,大大提升了數(shù)據(jù)包的處理性能。同時由于Intel DPDK在用戶空間就可以開發(fā)驅(qū)動,與傳統(tǒng)的在內(nèi)核中開發(fā)驅(qū)動相比,安全系數(shù)大大降低。因為內(nèi)核層權(quán)限比較高,操作相對比較危險,可能因為小的代碼bug就會導(dǎo)致系統(tǒng)崩潰,需要仔細(xì)的開發(fā)和廣泛的測試。而在應(yīng)用層則相反,比較安全,且在應(yīng)用層調(diào)試代碼要方便的多。
輪詢模式驅(qū)動模塊
PMD 相關(guān) API 實現(xiàn)了在輪詢方式下進(jì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、流分類和負(fù)載均衡等。并且,除以太網(wǎng)接口外,DPDK 還在定義用于加解密的軟硬件加速接口(Extensions)。
大頁技術(shù)
處理器的內(nèi)存管理包含兩個概念:物理內(nèi)存和虛擬內(nèi)存。Linux 操作系統(tǒng)里面整個物理內(nèi)存按幀(frames)來進(jìn)行管理,虛擬內(nèi)存按照頁(page)來進(jìn)行管理。
內(nèi)存管理單元(MMU)完成從虛擬內(nèi)存地址到物理內(nèi)存地址的轉(zhuǎn)換。內(nèi)存管理單元進(jìn)行地址轉(zhuǎn)換需要的信息保存在一個叫頁表(page table)的數(shù)據(jù)結(jié)構(gòu)里面,頁表查找是一種極其耗時的操作。為了減少頁表的查找過程,Intel 處理器實現(xiàn)了一塊緩存來保存查找結(jié)果,這塊緩存被稱為 TLB(Translation Lookaside Buffer),它保存了虛擬地址到物理地址的映射關(guān)系。所有虛擬地址在轉(zhuǎn)換為物理地址以前,處理器會首先在 TLB 中查找是否已經(jīng)存在有效的映射關(guān)系,如果沒有發(fā)現(xiàn)有效的映射,也就是 TLS miss,處理器再進(jìn)行頁表的查找。頁表的查找過程對性能影響極大,因此需要盡量減少 TLB miss 的發(fā)生。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ù)包使用。
DPDK中的內(nèi)存管理如圖,最下面是連續(xù)的物理內(nèi)存,這些物理內(nèi)存是由2MB的大頁組成,連續(xù)的物理內(nèi)存上面是內(nèi)存段,內(nèi)存段之上則是內(nèi)存區(qū),我們分配的基本單元對象是在內(nèi)存區(qū)中分配的,內(nèi)存區(qū)包含了ring隊列,內(nèi)存池、LPM路由表還有其他一些高性能的關(guān)鍵結(jié)構(gòu)。
輪詢技術(shù)
傳統(tǒng)網(wǎng)卡的報文接收/發(fā)送過程中,網(wǎng)卡硬件收到網(wǎng)絡(luò)報文,或發(fā)送完網(wǎng)絡(luò)報文后,需要發(fā)送中斷到 CPU,通知應(yīng)用軟件有網(wǎng)絡(luò)報文需要處理。在 x86 處理器上,一次中斷處理需要將處理器的狀態(tài)寄存器保存到堆棧,并運(yùn)行中斷服務(wù)程序,最后再將保存的狀態(tài)寄存器信息從堆棧中恢復(fù)。整個過程需要至少 300 個處理器時鐘周期。對于高性能網(wǎng)絡(luò)處理應(yīng)用,頻繁的中斷處理開銷極大降低了網(wǎng)絡(luò)應(yīng)用程序的性能。
為了減少中斷處理開銷,DPDK 使用了輪詢技術(shù)來處理網(wǎng)絡(luò)報文。網(wǎng)卡收到報文后,直接將報文保存到處理器 cache 中(有 DDIO(Direct Data I/O)技術(shù)的情況下),或者保存到內(nèi)存中(沒有 DDIO 技術(shù)的情況下),并設(shè)置報文到達(dá)的標(biāo)志位。應(yīng)用軟件則周期性地輪詢報文到達(dá)的標(biāo)志位,檢測是否有新報文需要處理。整個過程中完全沒有中斷處理過程,因此應(yīng)用程序的網(wǎng)絡(luò)報文處理能力得以極大提升。
CPU親和技術(shù)
現(xiàn)代操作系統(tǒng)都是基于分時調(diào)用方式來實現(xiàn)任務(wù)調(diào)度,多個進(jìn)程或線程在多核處理器的某一個核上不斷地交替執(zhí)行。每次切換過程,都需要將處理器的狀態(tài)寄存器保存在堆棧中, 并恢復(fù)當(dāng)前進(jìn)程的狀態(tài)信息,這對系統(tǒng)其實是一種處理開銷。將一個線程固定一個核上運(yùn)行, 可以消除切換帶來的額外開銷。另外將進(jìn)程或者線程遷移到多核處理器的其它核上進(jìn)行運(yùn)行時,處理器緩存中的數(shù)據(jù)也需要進(jìn)行清除,導(dǎo)致處理器緩存的利用效果降低。
CPU 親和技術(shù),就是將某個進(jìn)程或者線程綁定到特定的一個或者多個核上執(zhí)行,而不被遷移到其它核上運(yùn)行,這樣就保證了專用程序的性能。
DPDK 使用了 Linux pthread 庫,在系統(tǒng)中把相應(yīng)的線程和 CPU 進(jìn)行親和性綁定, 然后相應(yīng)的線程盡可能使用獨(dú)立的資源進(jìn)行相關(guān)的數(shù)據(jù)處理。
在一個多核處理器的機(jī)器上,每個CPU核心本身都存在自己的緩存,緩沖區(qū)里存放著線程使用的信息。如果線程沒有綁定CPU核,那么線程可能被Linux系統(tǒng)調(diào)度到其他的CPU上,這樣的話,CPU的cache命中率就降低了。利用CPU的affinity技術(shù),一旦線程綁定到某個CPU后,線程就會一直在指定的CPU上運(yùn)行,操作系統(tǒng)不會將其調(diào)度到其他的CPU上,節(jié)省了調(diào)度的性能消耗,從而提升了程序執(zhí)行的效率。
多核輪詢模式:多核輪詢模式有兩種,分別是IO獨(dú)占式和流水線式。IO獨(dú)占式是指每個核獨(dú)立完成數(shù)據(jù)包的接收、處理和發(fā)送過程,核之間相互獨(dú)立,其優(yōu)點(diǎn)是其中一個核出現(xiàn)問題時不影響其他核的數(shù)據(jù)收發(fā)。流水線式則采用多核合作的方式處理數(shù)據(jù)包,數(shù)據(jù)包的接收、處理和發(fā)送由不同的核完成。流水線式適合面向流的數(shù)據(jù)處理,其優(yōu)點(diǎn)是可對數(shù)據(jù)包按照接收的順序有序進(jìn)行處理,缺點(diǎn)是當(dāng)某個環(huán)境(例如接收)所涉及的核出現(xiàn)阻塞,則會造成收發(fā)中斷。
IO獨(dú)占式多核輪詢模式中每個網(wǎng)卡只分配給一個邏輯核進(jìn)行處理。每個邏輯核給所接管的網(wǎng)卡分別分配一個發(fā)送隊列和一個接收隊列,并且獨(dú)立完成數(shù)據(jù)包的接收、處理和發(fā)送的過程,核與核之間相互獨(dú)立。系統(tǒng)數(shù)據(jù)包的處理由多個邏輯核同時進(jìn)行,每個網(wǎng)卡的收發(fā)包隊列只能由一個邏輯核提供。當(dāng)數(shù)據(jù)包進(jìn)入網(wǎng)卡的硬件緩存區(qū),用戶空間提供的網(wǎng)卡驅(qū)動通過輪詢得知網(wǎng)卡收到數(shù)據(jù)包,從硬件緩沖區(qū)中取出數(shù)據(jù)包,并將數(shù)據(jù)包存入邏輯核提供的收包隊列中,邏輯核取出收包隊列中的數(shù)據(jù)包進(jìn)行處理,處理完畢后將數(shù)據(jù)包存入邏輯核提供的發(fā)包隊列,然后由網(wǎng)卡驅(qū)動取出發(fā)往網(wǎng)卡,最終發(fā)送到網(wǎng)絡(luò)中。
DPDK在AWCloud中的應(yīng)用
DPDK(Data Plane Development Kit)數(shù)據(jù)平面開發(fā)工具集,為Intel architecture(IA)處理器架構(gòu)下用戶空間高效的數(shù)據(jù)包處理提供庫函數(shù)和驅(qū)動的支持,它不同于Linux系統(tǒng)以通用性設(shè)計為目的,而是專注于網(wǎng)絡(luò)應(yīng)用中數(shù)據(jù)包的高性能處理。DPDK應(yīng)用程序是運(yùn)行在用戶空間上利用自身提供的數(shù)據(jù)平面庫來收發(fā)數(shù)據(jù)包,繞過了Linux內(nèi)核協(xié)議棧對數(shù)據(jù)包處理過程。加速數(shù)據(jù)的處理,用戶可以在用戶空間定制協(xié)議棧,滿足自己的應(yīng)用需求。相對傳統(tǒng)的基于內(nèi)核的網(wǎng)絡(luò)數(shù)據(jù)處理,DPDK對從內(nèi)核層到用戶層的網(wǎng)絡(luò)數(shù)據(jù)流程進(jìn)行了重大突破。
DPDK功能用于加速云主機(jī)和物理主機(jī)處理網(wǎng)絡(luò)數(shù)據(jù)包的速度。配合大頁內(nèi)存和CPU Affinity等一系列技術(shù),繞過系統(tǒng)對網(wǎng)絡(luò)數(shù)據(jù)包處理的繁瑣過程,提升網(wǎng)絡(luò)性能。
云平臺采用DPDK技術(shù)滿足網(wǎng)絡(luò)性能優(yōu)化,如下圖所示:
內(nèi)存池和無鎖環(huán)形緩存管理
此外Intel DPDK將庫和API優(yōu)化成了無鎖,比如無鎖隊列,可以防止多線程程序發(fā)生死鎖。然后對緩沖區(qū)等數(shù)據(jù)結(jié)構(gòu)進(jìn)行了cache對齊。如果沒有cache對齊,則可能在內(nèi)存訪問的時候多讀寫一次內(nèi)存和cache。
內(nèi)存池緩存區(qū)的申請和釋放采用的是生產(chǎn)者-消費(fèi)者模式無鎖緩存隊列進(jìn)行管理,避免隊列中鎖的開銷,在緩存區(qū)的使用過程中提高了緩沖區(qū)申請釋放的效率。
無鎖環(huán)形隊列生產(chǎn)過程
無鎖環(huán)形隊列消費(fèi)過程
如圖所示,生產(chǎn)者往隊列里存放內(nèi)容的方向和消費(fèi)者從隊列里取內(nèi)容的方向一致,均以順時針方向進(jìn)行。當(dāng)緩存區(qū)向內(nèi)存池申請內(nèi)存塊,或者應(yīng)用程序進(jìn)行內(nèi)存塊的釋放時,緩存區(qū)的無鎖環(huán)形隊列的生產(chǎn)者指針順時針移動,往隊列中存入內(nèi)存塊地址信息,進(jìn)行緩存隊列的生產(chǎn)過程。當(dāng)應(yīng)用程序需要向緩沖區(qū)申請內(nèi)存塊使用時,緩沖區(qū)的無鎖環(huán)形隊列的消費(fèi)者指針以順時針的方向取出隊列的內(nèi)存塊地址,分配給應(yīng)用程序使用,該過程為緩存隊列的消費(fèi)過程。
生產(chǎn)n個對象過程:首先生產(chǎn)者頭指針往順時針方向移n個位置獲得新的頭指針,然后從生產(chǎn)者尾指針指的區(qū)域開始逐個存入n個對象,最后生產(chǎn)者尾指針順時針移動n個位置獲得新的生產(chǎn)者尾指針
消費(fèi)n個對象過程:首先消費(fèi)者頭指針順時針移動n個位置獲得新的消費(fèi)者頭指針,然后從消費(fèi)者尾指針處開始逐個讀取n個對象,最后消費(fèi)者尾指針順時針移動n個位置獲得新的消費(fèi)者尾指針。
網(wǎng)絡(luò)存儲優(yōu)化
傳統(tǒng)Linux內(nèi)核網(wǎng)絡(luò)數(shù)據(jù)流程:
硬件中斷--->取包分發(fā)至內(nèi)核線程--->軟件中斷--->內(nèi)核線程在協(xié)議棧中處理包--->處理完畢通知用戶層
用戶層收包-->網(wǎng)絡(luò)層--->邏輯層--->業(yè)務(wù)層
dpdk 網(wǎng)絡(luò)數(shù)據(jù)流程:
硬件中斷--->放棄中斷流程
用戶層通過設(shè)備映射取包--->進(jìn)入用戶層協(xié)議棧--->邏輯層--->業(yè)務(wù)層
KNI是DPDK平臺提供的用于將數(shù)據(jù)重入內(nèi)核協(xié)議棧的一個組件,其目的是充分運(yùn)用傳統(tǒng)內(nèi)核協(xié)議棧已實現(xiàn)的較穩(wěn)定的協(xié)議處理功能。DPDK平臺對數(shù)據(jù)包的處理繞過了內(nèi)核協(xié)議棧,直接交給用戶空間處理,而用戶空間沒有完善的協(xié)議處理棧,如果讓開發(fā)人員在用戶空間實現(xiàn)完整獨(dú)立的協(xié)議棧,開發(fā)工作是非常復(fù)雜的,因此DPDK平臺提供了KNI組件,開發(fā)人員可以在用戶空間實現(xiàn)一些特殊的協(xié)議處理功能,再通過KNI重入內(nèi)核協(xié)議棧功能將普通常見的協(xié)議交由傳統(tǒng)內(nèi)核協(xié)議棧處理。
KNI通信機(jī)制
KNI組件通過創(chuàng)建KNI虛擬接口設(shè)備,將數(shù)據(jù)包經(jīng)過虛擬接口實現(xiàn)用戶空間和內(nèi)核協(xié)議棧間的通信。當(dāng)網(wǎng)卡接收到數(shù)據(jù)包時,應(yīng)用程序通過用戶空間驅(qū)動將數(shù)據(jù)包獲取到用戶空間,KNI組件將需要數(shù)據(jù)包發(fā)送至KNI虛擬接口,由KNI虛擬接口交給內(nèi)核協(xié)議棧處理,處理后若有響應(yīng)報文,則再交給KNI虛擬接口返回給應(yīng)用程序。其中發(fā)送數(shù)據(jù)包至內(nèi)核協(xié)議棧以及接收內(nèi)核協(xié)議?;貜?fù)的數(shù)據(jù)包,是由兩個不同的邏輯核分別進(jìn)行處理,不阻塞應(yīng)用程序讓內(nèi)核協(xié)議棧發(fā)送數(shù)據(jù)包或從內(nèi)核協(xié)議棧接收數(shù)據(jù)包的過程。
KNI接口實際上是一個虛擬出來的設(shè)備,該虛擬設(shè)備定義了四個隊列,分別是接收隊列(rx_q)、發(fā)送隊列(tx_q)、已分配內(nèi)存塊隊列(alloc_q)、待釋放內(nèi)存塊隊列(free_q)。接收隊列用于存放用戶空間程序發(fā)往KNI虛擬設(shè)備的報文,發(fā)送隊列用于存放內(nèi)核協(xié)議棧要往KNI虛擬設(shè)備的報文。已分配內(nèi)存塊隊列存放已向內(nèi)存中申請的內(nèi)存塊,供內(nèi)核協(xié)議棧發(fā)送報文時取出使用。待釋放內(nèi)存塊隊列用于記錄KNI虛擬設(shè)備從用戶空間程序處接收到報文后將不再使用的內(nèi)存塊,然后將該隊列中的內(nèi)存塊釋放回內(nèi)存。用戶空間程序從網(wǎng)卡接收到報文時,將報文發(fā)送給KNI虛擬設(shè)備,KNI虛擬設(shè)備接收到用戶空間程序發(fā)來的報文后,交給內(nèi)核協(xié)議棧進(jìn)行協(xié)議解析。發(fā)送報文時,原始數(shù)據(jù)先由內(nèi)核協(xié)議棧進(jìn)行協(xié)議封裝,然后將報文發(fā)送給KNI虛擬設(shè)備,KNI虛擬設(shè)備接收到報文后,再將報文發(fā)送給用戶空間程序
DPDK的UIO驅(qū)動屏蔽了硬件發(fā)出的中斷,然后在用戶態(tài)采用主動輪訓(xùn)的方式,這種模式被稱為PMD(Poll Mode Driver)
UIO 旁路了內(nèi)核,主動輪訓(xùn)去掉硬中斷,DPDK從而可以在用戶態(tài)做收發(fā)包處理。帶來zero copy,無系統(tǒng)調(diào)用的好處,同步處理減少上下文切換帶來的Cache MIss。
運(yùn)行在PMD的CORE會處于CPU100%的狀態(tài)。
網(wǎng)絡(luò)空閑時CPU 長期空轉(zhuǎn),會帶來能耗問題。所以,DPDK推出interrupt DPDK模式。
interrupt DPDK:
DPDK的高性能代碼實現(xiàn)
1. 采用HugePage減少TLB Miss:默認(rèn)下Linux采用4KB為一頁,頁越小內(nèi)存越大,頁表的開銷越大,頁表的內(nèi)存占用也越大。CPU有TLB(Translation Lookaside Buffer)成本高所以一般就只能存放幾百到上千個頁表項。如果進(jìn)程要使用64G內(nèi)存,則64G/4KB=16000000(一千六百萬)頁,每頁在頁表項中占用16000000 * 4B=62MB。如果用HugePage采用2MB作為一頁,只需64G/2MB=2000,數(shù)量不在同個級別。而DPDK采用HugePage,在x86-64下支持2MB、1GB的頁大小,幾何級的降低了頁表項的大小,從而減少TLB-Miss。并提供了內(nèi)存池(Mempool)、MBuf、無鎖環(huán)(Ring)、Bitmap等基礎(chǔ)庫。根據(jù)我們的實踐,在數(shù)據(jù)平面(Data Plane)頻繁的內(nèi)存分配釋放,必須使用內(nèi)存池,不能直接使用rte_malloc,DPDK的內(nèi)存分配實現(xiàn)非常簡陋,不如ptmalloc。
2. SNA(Shared-nothing Architecture)軟件架構(gòu)去中心化,盡量避免全局共享,帶來全局競爭,失去橫向擴(kuò)展的能力。NUMA體系下不跨Node遠(yuǎn)程使用內(nèi)存。
3. SIMD(Single Instruction Multiple Data)從最早的mmx/sse到最新的avx2,SIMD的能力一直在增強(qiáng)。DPDK采用批量同時處理多個包,再用向量編程,一個周期內(nèi)對所有包進(jìn)行處理。比如,memcpy就使用SIMD來提高速度。SIMD在游戲后臺比較常見,但是其他業(yè)務(wù)如果有類似批量處理的場景,要提高性能,也可看看能否滿足。
4. 不使用慢速API:這里需要重新定義一下慢速API,比如說gettimeofday,雖然在64位下通過vDSO已經(jīng)不需要陷入內(nèi)核態(tài),只是一個純內(nèi)存訪問,每秒也能達(dá)到幾千萬的級別。但是,不要忘記了我們在10GE下,每秒的處理能力就要達(dá)到幾千萬。所以即使是gettimeofday也屬于慢速API。DPDK提供Cycles接口,例如rte_get_tsc_cycles接口,基于HPET或TSC實現(xiàn)。
【DPDK高性能儲存】dpdk從tcpip協(xié)議棧開始,準(zhǔn)備好linux環(huán)境一起開始https://www.bilibili.com/video/BV1Sk4y1E7Bz/
【DPDk高性能儲存】C/C++開發(fā)很好的技術(shù)方向,dpdk網(wǎng)絡(luò)開發(fā)
https://www.bilibili.com/video/BV1Pc411M7Cx/
【DPDK高性能儲存】dpdk的底層原理 ,讓你可以開啟另一個技術(shù)方向
https://www.bilibili.com/video/BV1uP41117gA/
【DPDK高性能儲存】DPDK的前世今生,cc++程序員的未來方向
https://www.bilibili.com/video/BV1sT411b7Zw/
【DPDK高性能儲存】dpdk的虛擬化,vhost與virtio的故事,走進(jìn)qemu的實現(xiàn)原理https://www.bilibili.com/video/BV1nz4y1a7ji/
【DPDK高性能儲存】nff-go與dpdk的那些故事,golang調(diào)用c的流程分析https://www.bilibili.com/video/BV1Ds4y1X7vo/
【DPDK高性能儲存】5個dpdk的誤區(qū),用代碼來解決,從dpdk手寫協(xié)議棧開始https://www.bilibili.com/video/BV1cs4y197Gk/
【DPDK高性能儲存】10個關(guān)于dpdkspdk開發(fā)的技術(shù)問題https://www.bilibili.com/video/BV12s4y1X7YE/
【DPDK高性能儲存】fio的iops測試,為了fio手寫一個spdk的引擎,(自備linux環(huán)境)https:www.bilibili.com/video/BV1Ca4y1g7Wh/
【DPDK高性能儲存】vpp源碼流程剖析,動態(tài)庫加載,plugin,node,featrue流程https://www.bilibili.com/video/BV1Lz4y1a798/
【DPDK高性能儲存】SPDK是如何實現(xiàn)高性能的,深入NVMe的工作原理https://www.bilibili.com/video/BV1eM41137mB/
【DPDK高性能儲存】存儲框架spdk,為技術(shù)棧打開一扇存儲的大門https:www.bilibili.com/video/BV1P24y1M7tL/
【DPDK高性能儲存】看懂6個問題,開啟dpdk/spdk高性能開發(fā)之路https://www.bilibili.com/video/BV1BP41117Rg/
(1)DPDK基礎(chǔ)知識
1、dpdk環(huán)境搭建與多隊列網(wǎng)卡
2、dpdk網(wǎng)卡綁定與arp
3、dpdk發(fā)送過程的實現(xiàn)
4、dpdk發(fā)送過程調(diào)試
5、dpdk-arp實現(xiàn)
6、arp 調(diào)試流程
7、dpdk-icmp實現(xiàn)
8、dpdk-icmp流程 調(diào)試與checksum實現(xiàn)
9、arp-table的實現(xiàn)
(2)協(xié)議棧之udp/tcp的實現(xiàn)
1、arp request實現(xiàn)
2、arp調(diào)試流程
3、協(xié)議棧架構(gòu)設(shè)計優(yōu)化
4、udp實現(xiàn)之udp系統(tǒng)api的設(shè)計
5、udp實現(xiàn)之sbuf與rbuf的環(huán)形隊列
6、udp實現(xiàn)之發(fā)送流程與并發(fā)解耦
7、udp實現(xiàn)之架構(gòu)設(shè)計與調(diào)試
8、tcp 三次握手實現(xiàn)之dpdk tcp流程架構(gòu)設(shè)計
9、tcp三次握手實現(xiàn)之dpdk tcp11個狀態(tài)實現(xiàn)
10、tcp三次握手實現(xiàn)之dpdk代碼調(diào)試
(3)協(xié)議棧之tcp的實現(xiàn)
1、tcp數(shù)據(jù)傳輸之a(chǎn)ck與seqnum的確認(rèn)代碼實現(xiàn)以及滑動窗口
2、tcp數(shù)據(jù)傳輸之a(chǎn)ck與seqnum代碼實現(xiàn)以及滑動窗口
3、tcp協(xié)議api實 現(xiàn)之bind, listen的實現(xiàn)
4、tcp協(xié)議api實現(xiàn)之a(chǎn)ccept的實現(xiàn)
5、tcp協(xié)議api實現(xiàn)之send, recv的實現(xiàn)
6、tcp協(xié)議api實 現(xiàn)之close的實現(xiàn)
7、tcp協(xié)議棧調(diào)試之段錯誤與邏輯流程
8、tcp協(xié)議棧調(diào)試之ringbuffer內(nèi)存錯誤.
9、dpdk kni的原理與kni啟動
10、重構(gòu)網(wǎng)絡(luò)協(xié)議分發(fā)的流程
(4)協(xié)議棧的組件功能
1、kni抓包調(diào)試tcpdump
2、dpdk kni mempool錯誤與內(nèi)存泄漏
3、基于熵的ddos檢測的數(shù)學(xué)理論
4、dpdk ddos熵計算代碼實現(xiàn)
5、dpdkddosattach檢測準(zhǔn)確度調(diào)試
6、ddos attack測試工具h(yuǎn)ping3
7、dpdk布谷鳥hash原理與使用
(5)協(xié)議棧之tcp并發(fā)實現(xiàn)
1、tcp并發(fā)連接的設(shè)計
2、tcp并發(fā)epoll的實現(xiàn)
3、tcp并 發(fā)協(xié)議棧與epoll的回調(diào)與并發(fā)測試
4、bpf與bpftrace系統(tǒng),網(wǎng)絡(luò)掛載實現(xiàn)
5、bpf與 bpftrace應(yīng)用程序ntyco的掛載監(jiān)控
(6)DPDK網(wǎng)絡(luò)基礎(chǔ)組件
1、mempool與mbuf的源碼分析講解
2、dpdk-ringbuffer源碼分 析
3、dpdk-igb_ uio源碼分 析
4、dpdk-kni源碼分析
5、rcu的實現(xiàn)與互斥鎖,自旋鎖,讀寫鎖
解決問題
1、苦讀網(wǎng)絡(luò)書籍沒有實際項目運(yùn)用
2、簡歷沒有合適的網(wǎng)絡(luò)項目可寫
3、有C基礎(chǔ),純興趣愛好
DPDK的大多數(shù)應(yīng)用最初是在電信領(lǐng)域。隨著CSP采用網(wǎng)絡(luò)虛擬化來降低運(yùn)營成本并加快新服務(wù)的部署,他們虛擬化了需要高吞吐量和/或低延遲的用例,例如路由器,防火墻,無線電訪問網(wǎng)絡(luò)(RAN)和演進(jìn)的分組核心(EPC)。虛擬化平臺的供應(yīng)商,在這些情況下,VNF和應(yīng)用程序已在其產(chǎn)品中利用了DPDK,以實現(xiàn)CSP的性能目標(biāo)。隨著CSP探索新的邊緣托管應(yīng)用,例如視頻緩存,監(jiān)控,增強(qiáng)現(xiàn)實(AR),輔助駕駛,零售和工業(yè)物聯(lián)網(wǎng),DPDK仍然是實現(xiàn)積極性能目標(biāo)的關(guān)鍵技術(shù)。
類似DPDK最先在電信應(yīng)用程序中, 對數(shù)據(jù)包處理功能的性能要求一樣, DPDK越來越多地應(yīng)用于企業(yè)和云當(dāng)中。例如,在2018年,VMware引入了他們的NSX-T數(shù)據(jù)中心軟件定義基礎(chǔ)結(jié)構(gòu)的基于DPDK的邊緣配置。此版本的NSX-T地址需要具有可變數(shù)據(jù)包大小的高數(shù)據(jù)包吞吐量的應(yīng)用程序以及支持具有以下功能的高速NIC的服務(wù)器高達(dá)100Gbps的北/南流量。通常,南北向流的包大小各不相同,數(shù)據(jù)包處理要求,即使它們只占總流量的不到20%。在此用例中,通過使用帶有小數(shù)據(jù)包(64字節(jié))的DPDK,英特爾和VMware的分析表明,性能提高了五倍。
同時有幾家公司已將DPDK用于金融應(yīng)用,其中低延遲帶來了巨大的競爭優(yōu)勢。例如,在高頻交易(HFT)中,延遲會直接影響交易者的交易效率 算法策略及其超越競爭對手的能力。信息周刊估計,對于一家大型經(jīng)紀(jì)公司來說,一毫秒每年價值1億美元。DPDK是這個市場解決方案供應(yīng)商開發(fā)所依賴的關(guān)鍵技術(shù)。
寫在最后:
Dpdk作為目前在互聯(lián)網(wǎng)越來越流行的底層技術(shù),受到越來越多的優(yōu)秀互聯(lián)網(wǎng)公司的歡迎與使用。但對于不少程序員來說可能只是見過或是聽過,并沒有深入的學(xué)習(xí)和使用。
聯(lián)系客服