九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
手把手實現(xiàn)tcp/ip用戶態(tài)協(xié)議棧,幫你實踐網(wǎng)絡(luò)知識(網(wǎng)絡(luò)必備,面試項目)

一、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工作原理:

  1. 初始化:在應(yīng)用程序啟動時,DPDK初始化了所有需要的硬件設(shè)備、線程和內(nèi)存池等資源,并且為每個CPU核心分配一個獨(dú)立的運(yùn)行環(huán)境。

  2. 接收數(shù)據(jù):當(dāng)一個數(shù)據(jù)包到達(dá)網(wǎng)卡時,DPDK會將其緩存在一個環(huán)形緩沖區(qū)中,并通知應(yīng)用程序有新數(shù)據(jù)到達(dá)。

  3. 數(shù)據(jù)包分類:應(yīng)用程序根據(jù)預(yù)定義的規(guī)則對數(shù)據(jù)包進(jìn)行分類(例如流量監(jiān)控、負(fù)載均衡、安全檢查等),并將它們發(fā)送到相應(yīng)的隊列中。

  4. 數(shù)據(jù)包處理:DPDK從隊列中取出待處理的數(shù)據(jù)包,并使用用戶空間驅(qū)動程序(userspace driver)進(jìn)行數(shù)據(jù)包解析、協(xié)議轉(zhuǎn)換和業(yè)務(wù)邏輯處理等操作。

  5. 數(shù)據(jù)包發(fā)送:完成處理后,DPDK將結(jié)果重新打包成網(wǎng)絡(luò)報文,并通過網(wǎng)卡發(fā)送回網(wǎng)絡(luò)中。

  6. 回收資源:當(dāng)應(yīng)用程序不再需要某些資源時,DPDK會將它們釋放回內(nèi)存池或者硬件設(shè)備中,以便其他線程或者進(jìn)程使用。

4.1技術(shù)原理與架構(gòu)

由于采用軟件轉(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ù)。

4.2主要特點(diǎn)

基于 OS 內(nèi)核的數(shù)據(jù)傳輸有什么弊端

  1. 中斷處理。當(dāng)網(wǎng)絡(luò)中大量數(shù)據(jù)包到來時,會產(chǎn)生頻繁的硬件中斷請求,這些硬件中斷可以打斷之前較低優(yōu)先級的軟中斷或者系統(tǒng)調(diào)用的執(zhí)行過程,如果這種打斷頻繁的話,將會產(chǎn)生較高的性能開銷。

  2. 內(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%。

  3. 上下文切換。頻繁到達(dá)的硬件中斷和軟中斷都可能隨時搶占系統(tǒng)調(diào)用的運(yùn)行,這會產(chǎn)生大量的上下文切換開銷。另外,在基于多線程的服務(wù)器設(shè)計框架中,線程間的調(diào)度也會產(chǎn)生頻繁的上下文切換開銷,同樣,鎖競爭的耗能也是一個非常嚴(yán)重的問題。

  4. 局部性失效。如今主流的處理器都是多個核心的,這意味著一個數(shù)據(jù)包的處理可能跨多個 CPU 核心,比如一個數(shù)據(jù)包可能中斷在 cpu0,內(nèi)核態(tài)處理在 cpu1,用戶態(tài)處理在 cpu2,這樣跨多個核心,容易造成 CPU 緩存失效,造成局部性失效。如果是 NUMA 架構(gòu),更會造成跨 NUMA 訪問內(nèi)存,性能受到很大影響。

  5. 內(nèi)存管理。傳統(tǒng)服務(wù)器內(nèi)存頁為 4K,為了提高內(nèi)存的訪問速度,避免 cache miss,可以增加 cache 中映射表的條目,但這又會影響 CPU 的檢索效率。

針對這些問題,可探討的技術(shù)點(diǎn):

  1. 控制層和數(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)度等等問題。

  2. 使用多核編程技術(shù)代替多線程技術(shù),并設(shè)置 CPU 的親和性,將線程和 CPU 核進(jìn)行一比一綁定,減少彼此之間調(diào)度切換。

  3. 針對 NUMA 系統(tǒng),盡量使 CPU 核使用所在 NUMA 節(jié)點(diǎn)的內(nèi)存,避免跨內(nèi)存訪問。

  4. 使用大頁內(nèi)存代替普通的內(nèi)存,減少 cache-miss。

  5. 采用無鎖技術(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ù)采集效率。

不使用與使用DPDK的Linux內(nèi)核對比

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ū)別。

linux內(nèi)核處理包

dpdk處理包

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ā)送如圖:

數(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)化

4.3DPDK的突破

傳統(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ù)層

4.4KNI組件

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ā)送給用戶空間程序

4.5DKDP核心優(yōu)化

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高性能儲存】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/

六、手寫TCP/IP用戶態(tài)協(xié)議棧(純C語言)

(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ǔ),純興趣愛好

手寫3000行代碼,讓你掌握網(wǎng)絡(luò)通信核心技術(shù)。

七、DPDK市場發(fā)展

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í)和使用。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
當(dāng)eBPF遇上Linux內(nèi)核網(wǎng)絡(luò)
Linux內(nèi)核UDP收包為什么效率低?能做什么優(yōu)化?
DPDK
DPDK分析
?RDMA 基礎(chǔ)
NFV落地要邁過哪些坎?
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服