網(wǎng)絡(luò)設(shè)備(路由器、交換機(jī)、媒體網(wǎng)關(guān)、SBC、PS網(wǎng)關(guān)等)需要在瞬間進(jìn)行大量的報(bào)文收發(fā),因此在傳統(tǒng)的網(wǎng)絡(luò)設(shè)備上,往往能夠看到專(zhuān)門(mén)的NP(Network Process)處理器,有的用FPGA,有的用ASIC。這些專(zhuān)用器件通過(guò)內(nèi)置的硬件電路(或通過(guò)編程形成的硬件電路)高效轉(zhuǎn)發(fā)報(bào)文,只有需要對(duì)報(bào)文進(jìn)行深度處理的時(shí)候才需要CPU干涉。
但在公有云、NFV等應(yīng)用場(chǎng)景下,基礎(chǔ)設(shè)施以CPU為運(yùn)算核心,往往不具備專(zhuān)用的NP處理器,操作系統(tǒng)也以通用Linux為主,網(wǎng)絡(luò)數(shù)據(jù)包的收發(fā)處理路徑如下圖所示:
在虛擬化環(huán)境中,路徑則會(huì)更長(zhǎng):
由于包處理任務(wù)存在內(nèi)核態(tài)與用戶(hù)態(tài)的切換,以及多次的內(nèi)存拷貝,系統(tǒng)消耗變大,以CPU為核心的系統(tǒng)存在很大的處理瓶頸。為了提升在通用服務(wù)器(COTS)的數(shù)據(jù)包處理效能,Intel推出了服務(wù)于IA(Intel Architecture)系統(tǒng)的DPDK技術(shù)。
DPDK是Data Plane Development Kit的縮寫(xiě)。簡(jiǎn)單說(shuō),DPDK應(yīng)用程序運(yùn)行在操作系統(tǒng)的User Space,利用自身提供的數(shù)據(jù)面庫(kù)進(jìn)行收發(fā)包處理,繞過(guò)了Linux內(nèi)核態(tài)協(xié)議棧,以提升報(bào)文處理效率。
DPDK是一組lib庫(kù)和工具包的集合。最簡(jiǎn)單的架構(gòu)描述如下圖所示:
上圖藍(lán)色部分是DPDK的主要組件(更全面更權(quán)威的DPDK架構(gòu)可以參考Intel官網(wǎng)),簡(jiǎn)單解釋一下:
- PMD:Pool Mode Driver,輪詢(xún)模式驅(qū)動(dòng),通過(guò)非中斷,以及數(shù)據(jù)幀進(jìn)出應(yīng)用緩沖區(qū)內(nèi)存的零拷貝機(jī)制,提高發(fā)送/接受數(shù)據(jù)幀的效率
- 流分類(lèi):Flow Classification,為N元組匹配和LPM(最長(zhǎng)前綴匹配)提供優(yōu)化的查找算法
- 環(huán)隊(duì)列:Ring Queue,針對(duì)單個(gè)或多個(gè)數(shù)據(jù)包生產(chǎn)者、單個(gè)數(shù)據(jù)包消費(fèi)者的出入隊(duì)列提供無(wú)鎖機(jī)制,有效減少系統(tǒng)開(kāi)銷(xiāo)
- MBUF緩沖區(qū)管理:分配內(nèi)存創(chuàng)建緩沖區(qū),并通過(guò)建立MBUF對(duì)象,封裝實(shí)際數(shù)據(jù)幀,供應(yīng)用程序使用
- EAL:Environment Abstract Layer,環(huán)境抽象(適配)層,PMD初始化、CPU內(nèi)核和DPDK線程配置/綁定、設(shè)置HugePage大頁(yè)內(nèi)存等系統(tǒng)初始化
這么說(shuō)可能還有一點(diǎn)點(diǎn)抽象,再總結(jié)一下DPDK的核心思想:
- 用戶(hù)態(tài)模式的PMD驅(qū)動(dòng),去除中斷,避免內(nèi)核態(tài)和用戶(hù)態(tài)內(nèi)存拷貝,減少系統(tǒng)開(kāi)銷(xiāo),從而提升I/O吞吐能力
- 用戶(hù)態(tài)有一個(gè)好處,一旦程序崩潰,不至于導(dǎo)致內(nèi)核完蛋,帶來(lái)更高的健壯性
- HugePage,通過(guò)更大的內(nèi)存頁(yè)(如1G內(nèi)存頁(yè)),減少TLB(Translation Lookaside Buffer,即快表) Miss,Miss對(duì)報(bào)文轉(zhuǎn)發(fā)性能影響很大
- 多核設(shè)備上創(chuàng)建多線程,每個(gè)線程綁定到獨(dú)立的物理核,減少線程調(diào)度的開(kāi)銷(xiāo)。同時(shí)每個(gè)線程對(duì)應(yīng)著獨(dú)立免鎖隊(duì)列,同樣為了降低系統(tǒng)開(kāi)銷(xiāo)
- 向量指令集,提升CPU流水線效率,降低內(nèi)存等待開(kāi)銷(xiāo)
下圖簡(jiǎn)單描述了DPDK的多隊(duì)列和多線程機(jī)制:
DPDK將網(wǎng)卡接收隊(duì)列分配給某個(gè)CPU核,該隊(duì)列收到的報(bào)文都交給該核上的DPDK線程處理。存在兩種方式將數(shù)據(jù)包發(fā)送到接收隊(duì)列之上:
- RSS(Receive Side Scaling,接收方擴(kuò)展)機(jī)制:根據(jù)關(guān)鍵字,比如根據(jù)UDP的四元組<srcIP><dstIP><srcPort><dstPort>進(jìn)行哈希
- Flow Director機(jī)制:可設(shè)定根據(jù)數(shù)據(jù)包某些信息進(jìn)行精確匹配,分配到指定的隊(duì)列與CPU核
當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包(幀)被網(wǎng)卡接收后,DPDK網(wǎng)卡驅(qū)動(dòng)將其存儲(chǔ)在一個(gè)高效緩沖區(qū)中,并在MBUF緩存中創(chuàng)建MBUF對(duì)象與實(shí)際網(wǎng)絡(luò)包相連,對(duì)網(wǎng)絡(luò)包的分析和處理都會(huì)基于該MBUF,必要的時(shí)候才會(huì)訪問(wèn)緩沖區(qū)中的實(shí)際網(wǎng)絡(luò)包
以上就是DPDK的基礎(chǔ)知識(shí),關(guān)于如何在應(yīng)用程序中使用DPDK,以及系統(tǒng)應(yīng)該如何針對(duì)報(bào)文收發(fā)的成熟優(yōu)化方式,后面一邊學(xué)習(xí)與實(shí)踐,一邊記錄。
晚安