01 技術(shù)原理與架構(gòu)
由于采用軟件轉(zhuǎn)發(fā)和軟件交換技術(shù),單服務(wù)器內(nèi)部的轉(zhuǎn)發(fā)能力是 NFV 系統(tǒng)的主要性能瓶頸。在各類高速轉(zhuǎn)發(fā)的 NFV 應(yīng)用中,數(shù)據(jù)報(bào)文從網(wǎng)卡中接收,再傳送到虛擬化的用戶態(tài)應(yīng)用程序(VNF)處理,整個(gè)過(guò)程要經(jīng)歷 CPU 中斷處理、虛擬化 I/O 與地址映射轉(zhuǎn)換、虛擬交換層、網(wǎng)絡(luò)協(xié)議棧、內(nèi)核上下文切換、內(nèi)存拷貝等多個(gè)費(fèi)時(shí)的 CPU 操作和 I/O 處理環(huán)節(jié)。
業(yè)內(nèi)通常采用消除海量中斷、旁路內(nèi)核協(xié)議棧、減少內(nèi)存拷貝、CPU 多核任務(wù)分擔(dān)、Intel VT 等技術(shù)來(lái)綜合提升服務(wù)器數(shù)據(jù)平面的報(bào)文處理性能,普通用戶較難掌握。業(yè)界迫切需要一種綜合的性能優(yōu)化方案,同時(shí)提供良好的用戶開(kāi)發(fā)和商業(yè)集成環(huán)境,DPDK 加速技術(shù)方案成為其中的典型代表。
DPDK 是一個(gè)開(kāi)源的數(shù)據(jù)平面開(kāi)發(fā)工具集,提供了一個(gè)用戶空間下的高效數(shù)據(jù)包處理庫(kù)函數(shù),它通過(guò)環(huán)境抽象層旁路內(nèi)核協(xié)議棧、輪詢模式的報(bào)文無(wú)中斷收發(fā)、優(yōu)化內(nèi)存/緩沖區(qū)/隊(duì)列管理、基于網(wǎng)卡多隊(duì)列和流識(shí)別的負(fù)載均衡等多項(xiàng)技術(shù),實(shí)現(xiàn)了在 x86 處理器架構(gòu)下的高性能報(bào)文轉(zhuǎn)發(fā)能力,用戶可以在 Linux 用戶態(tài)空間開(kāi)發(fā)各類高速轉(zhuǎn)發(fā)應(yīng)用,也適合與各類商業(yè)化的數(shù)據(jù)平面加速解決方案進(jìn)行集成。
英特爾在 2010 年啟動(dòng)了對(duì) DPDK 技術(shù)的開(kāi)源化進(jìn)程,于當(dāng)年 9 月通過(guò) BSD 開(kāi)源許可協(xié)議正式發(fā)布源代碼軟件包,并于 2014 年 4 月在 www.dpdk.org 上正式成立了獨(dú)立的開(kāi)源社區(qū)平臺(tái),為開(kāi)發(fā)者提供支持。開(kāi)源社區(qū)的參與者們大幅推進(jìn)了 DPDK 的技術(shù)創(chuàng)新和快速演進(jìn),而今它已發(fā)展成為 SDN 和 NFV 的一項(xiàng)關(guān)鍵技術(shù)。
02 軟件架構(gòu)
DPDK 的組成架構(gòu)如圖所示,相關(guān)技術(shù)原理概述如下:
在最底部的內(nèi)核態(tài)(Linux Kernel)DPDK 有兩個(gè)模塊:KNI 與 IGB_UIO。其中,KNI 提供給用戶一個(gè)使用 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ù),在初始化過(guò)程中將網(wǎng)卡硬件寄存器映射到用戶態(tài)。
如圖,DPDK 的上層用戶態(tài)由很多庫(kù)組成,主要包括核心部件庫(kù)(Core Libraries)、平臺(tái)相關(guān)模塊(Platform)、網(wǎng)卡輪詢模式驅(qū)動(dòng)模塊(PMD-Natives&Virtual)、QoS 庫(kù)、報(bào)文轉(zhuǎn)發(fā)分類算法(Classify)等幾大類,用戶應(yīng)用程序可以使用這些庫(kù)進(jìn)行二次開(kāi)發(fā),下面分別簡(jiǎn)要介紹。
核心部件庫(kù):該模塊構(gòu)成的運(yùn)行環(huán)境是建立在 Linux 上,通過(guò)環(huán)境抽象層(EAL)的運(yùn)行環(huán)境進(jìn)行初始化,包括:HugePage 內(nèi)存分配、內(nèi)存/緩沖區(qū)/隊(duì)列分配與無(wú)鎖操作、CPU 親和性綁定等;其次,EAL 實(shí)現(xiàn)了對(duì)操作系統(tǒng)內(nèi)核與底層網(wǎng)卡 I/O 操作的屏蔽(I/O 旁路了內(nèi)核及其協(xié)議棧),為 DPDK 應(yīng)用程序提供了一組調(diào)用接口,通過(guò) UIO 或 VFIO 技術(shù)將 PCI 設(shè)備地址映射到用戶空間,方便了應(yīng)用程序調(diào)用,避免了網(wǎng)絡(luò)協(xié)議棧和內(nèi)核切換造成的處理延遲。
另外,核心部件還包括創(chuàng)建適合報(bào)文處理的內(nèi)存池、緩沖區(qū)分配管理、內(nèi)存拷貝、以及定時(shí)器、環(huán)形緩沖區(qū)管理等。
平臺(tái)相關(guān)模塊:其內(nèi)部模塊主要包括 KNI、能耗管理以及 IVSHMEM 接口。其中,KNI 模塊主要通過(guò) kni.ko 模塊將數(shù)據(jù)報(bào)文從用戶態(tài)傳遞給內(nèi)核態(tài)協(xié)議棧處理,以便用戶進(jìn)程使用傳統(tǒng)的 socket 接口對(duì)相關(guān)報(bào)文進(jìn)行處理;能耗管理則提供了一些 API,應(yīng)用程序可以根據(jù)收包速率動(dòng)態(tài)調(diào)整處理器頻率或進(jìn)入處理器的不同休眠狀態(tài);另外,IVSHMEM 模塊提供了虛擬機(jī)與虛擬機(jī)之間,或者虛擬機(jī)與主機(jī)之間的零拷貝共享內(nèi)存機(jī)制,當(dāng) DPDK 程序運(yùn)行時(shí),IVSHMEM 模塊會(huì)調(diào)用核心部件庫(kù) API,把幾個(gè) HugePage 映射為一個(gè) IVSHMEM 設(shè)備池,并通過(guò)參數(shù)傳遞給 QEMU,這樣,就實(shí)現(xiàn)了虛擬機(jī)之間的零拷貝內(nèi)存共享。
輪詢模式驅(qū)動(dòng)模塊:PMD 相關(guān) API 實(shí)現(xiàn)了在輪詢方式下進(jìn)行網(wǎng)卡報(bào)文收發(fā),避免了常規(guī)報(bào)文處理方法中因采用中斷方式造成的響應(yīng)延遲,極大提升了網(wǎng)卡收發(fā)性能。此外,該模塊還同時(shí)支持物理和虛擬化兩種網(wǎng)絡(luò)接口,從僅僅支持 Intel 網(wǎng)卡,發(fā)展到支持 Cisco、Broadcom、Mellanox、Chelsio 等整個(gè)行業(yè)生態(tài)系統(tǒng),以及基于 KVM、VMWARE、 XEN 等虛擬化網(wǎng)絡(luò)接口的支持。
DPDK 還定義了大量 API 來(lái)抽象數(shù)據(jù)平面的轉(zhuǎn)發(fā)應(yīng)用,如 ACL、QoS、流分類和負(fù)載均衡等。并且,除以太網(wǎng)接口外,DPDK 還在定義用于加解密的軟硬件加速接口(Extensions)。
03 大頁(yè)技術(shù)
處理器的內(nèi)存管理包含兩個(gè)概念:物理內(nèi)存和虛擬內(nèi)存。Linux 操作系統(tǒng)里面整個(gè)物理內(nèi)存按幀(frames)來(lái)進(jìn)行管理,虛擬內(nèi)存按照頁(yè)(page)來(lái)進(jìn)行管理。內(nèi)存管理單元(MMU)完成從虛擬內(nèi)存地址到物理內(nèi)存地址的轉(zhuǎn)換。內(nèi)存管理單元進(jìn)行地址轉(zhuǎn)換需要的信息保存在一個(gè)叫頁(yè)表(page table)的數(shù)據(jù)結(jié)構(gòu)里面,頁(yè)表查找是一種極其耗時(shí)的操作。
x86 處理器硬件在缺省配置下,頁(yè)的大小是 4K,但也可以支持更大的頁(yè)表尺寸,例如2M 或 1G 的頁(yè)表。使用了大頁(yè)表功能后,一個(gè) TLB 表項(xiàng)可以指向更大的內(nèi)存區(qū)域,這樣可以大幅減少 TLB miss 的發(fā)生。早期的 Linux 并沒(méi)有利用 x86 硬件提供的大頁(yè)表功能,僅在 Linux內(nèi)核 2.6.33 以后的版本,應(yīng)用軟件才可以使用大頁(yè)表功能,具體的介紹可以參見(jiàn) Linux 的大頁(yè)表文件系統(tǒng)(hugetlbfs)特性。
DPDK 則利用大頁(yè)技術(shù),所有的內(nèi)存都是從 HugePage 里分配,實(shí)現(xiàn)對(duì)內(nèi)存池(mempool)的管理,并預(yù)先分配好同樣大小的 mbuf,供每一個(gè)數(shù)據(jù)包使用。
04 輪詢技術(shù)
為了減少中斷處理開(kāi)銷(xiāo),DPDK 使用了輪詢技術(shù)來(lái)處理網(wǎng)絡(luò)報(bào)文。網(wǎng)卡收到報(bào)文后,直接將報(bào)文保存到處理器 cache 中(有 DDIO(Direct Data I/O)技術(shù)的情況下),或者保存到內(nèi)存中(沒(méi)有 DDIO 技術(shù)的情況下),并設(shè)置報(bào)文到達(dá)的標(biāo)志位。應(yīng)用軟件則周期性地輪詢報(bào)文到達(dá)的標(biāo)志位,檢測(cè)是否有新報(bào)文需要處理。整個(gè)過(guò)程中完全沒(méi)有中斷處理過(guò)程,因此應(yīng)用程序的網(wǎng)絡(luò)報(bào)文處理能力得以極大提升。
05 GPU親和技術(shù)
現(xiàn)代操作系統(tǒng)都是基于分時(shí)調(diào)用方式來(lái)實(shí)現(xiàn)任務(wù)調(diào)度,多個(gè)進(jìn)程或線程在多核處理器的某一個(gè)核上不斷地交替執(zhí)行。每次切換過(guò)程,都需要將處理器的狀態(tài)寄存器保存在堆棧中,并恢復(fù)當(dāng)前進(jìn)程的狀態(tài)信息,這對(duì)系統(tǒng)其實(shí)是一種處理開(kāi)銷(xiāo)。將一個(gè)線程固定一個(gè)核上運(yùn)行,可以消除切換帶來(lái)的額外開(kāi)銷(xiāo)。另外將進(jìn)程或者線程遷移到多核處理器的其它核上進(jìn)行運(yùn)行時(shí),處理器緩存中的數(shù)據(jù)也需要進(jìn)行清除,導(dǎo)致處理器緩存的利用效果降低。
CPU 親和技術(shù),就是將某個(gè)進(jìn)程或者線程綁定到特定的一個(gè)或者多個(gè)核上執(zhí)行,而不被遷移到其它核上運(yùn)行,這樣就保證了專用程序的性能。
DPDK 使用了 Linux pthread 庫(kù),在系統(tǒng)中把相應(yīng)的線程和 CPU 進(jìn)行親和性綁定, 然后相應(yīng)的線程盡可能使用獨(dú)立的資源進(jìn)行相關(guān)的數(shù)據(jù)處理。
基于 DPDK 進(jìn)行應(yīng)用開(kāi)發(fā)和環(huán)境配置時(shí),應(yīng)用程序性能的影響因素以及相應(yīng)的優(yōu)化調(diào)整方法。這些因素并非必然劣化性能,可能因硬件能力、OS 版本、各類軟硬環(huán)境參數(shù)配置等的差異產(chǎn)生較大波動(dòng),或者存在較大的不穩(wěn)定性,相關(guān)的調(diào)優(yōu)方法需要用戶結(jié)合自身的VNF應(yīng)用部署在實(shí)踐中不斷完善。
1、硬件結(jié)構(gòu)的影響
DPDK 具有廣泛的平臺(tái)適應(yīng)性,可以運(yùn)行在整個(gè) x86 平臺(tái),從主流服務(wù)器平臺(tái)(從高性能或者高能效產(chǎn)品系列),到桌面或者嵌入式平臺(tái),也可以運(yùn)行于基于 Power 或者其他架構(gòu)的運(yùn)算平臺(tái)。圖展示了一個(gè)通用雙路服務(wù)器的內(nèi)部架構(gòu),它包含了 2 個(gè)中央處理器,2個(gè)分離的內(nèi)存控制單元來(lái)連接系統(tǒng)內(nèi)存,芯片組會(huì)擴(kuò)展出大量高速的 PCIe 2.0/3.0 接口,用于連接外設(shè),如 10Gbps 或者 25Gbps 網(wǎng)卡外設(shè)。
2、OS 版本及其內(nèi)核的影響
不同的 Linux OS 發(fā)行版使用的 Linux 內(nèi)核版本不一樣,配置的 Linux OS服務(wù)也不一樣。這些差異都會(huì)導(dǎo)致應(yīng)用程序在網(wǎng)絡(luò)報(bào)文處理能力上有所差別。
由于 Linux 內(nèi)核還在不斷演進(jìn),Linux 的發(fā)行版也數(shù)量眾多,本文無(wú)法提供最佳 Linux內(nèi)核版本和配置,而只能給出部分參考建議,如:關(guān)閉部分 OS 服務(wù)。在后續(xù)章節(jié),我們選取了目前比較流行的 Linux 發(fā)行版進(jìn)行了測(cè)試,并給出測(cè)試結(jié)果。從測(cè)試結(jié)果中顯示,同樣的硬件配置環(huán)境下,不同的 Linux 發(fā)行版在小包的處理能力上存在差異。
2.1 關(guān)閉 OS 部分服務(wù)
在 10G 端口上 64Byte 報(bào)文的線速到達(dá)率為 14.88Mpps,如果實(shí)現(xiàn)零丟包的線速處理,每個(gè)報(bào)文的平均處理速度應(yīng)該小于 1/14.48Mpps=67us,DPDK 應(yīng)用的網(wǎng)卡收發(fā)包隊(duì)列長(zhǎng)度缺省配置為 128,網(wǎng)卡隊(duì)列填充滿的時(shí)間是 128*67=8579us。也就是說(shuō),DPDK 的業(yè)務(wù)進(jìn)程,如果被操作系統(tǒng)中斷超過(guò) 8579us,就會(huì)導(dǎo)致網(wǎng)卡收發(fā)報(bào)的隊(duì)列被充滿,無(wú)法接收新的報(bào)文,從而導(dǎo)致丟包。而操作系統(tǒng)的中斷服務(wù)程序、后臺(tái)服務(wù)程序、以及任務(wù)調(diào)度程序都會(huì)導(dǎo)致DPDK 的應(yīng)用程序被打斷。
在 NFV 應(yīng)用場(chǎng)景下,Host 機(jī)器上和 Guest 機(jī)器上都運(yùn)行著操作系統(tǒng),由此帶來(lái)了兩級(jí)的操作任務(wù)調(diào)度。DPDK 應(yīng)用程序(NFV 中的 VNF)均運(yùn)行在虛擬機(jī)上,操作系統(tǒng)帶來(lái)的影響會(huì)更加明顯。
為了實(shí)現(xiàn) DPDK 應(yīng)用程序的零丟包,需要對(duì)操作系統(tǒng)進(jìn)行適當(dāng)?shù)呐渲?,減少操作系統(tǒng)的對(duì) DPDK 應(yīng)用程序的干擾。操作系統(tǒng)配置的總體思路是:
將運(yùn)行 DPDK 應(yīng)用運(yùn)行的處理器核進(jìn)行隔離,減少干擾;
停用不需要的后臺(tái)服務(wù)程序。將不需要的中斷,轉(zhuǎn)移到其它處理器核上處理;
對(duì)于不能轉(zhuǎn)移的中斷,減少中斷的次數(shù)。
2.2 OS 調(diào)整示例
下面以 CentOS 7 為例,說(shuō)明具體的調(diào)整方法。絕大部分的操作需要同時(shí)在 Host 操作系統(tǒng)和 Guest 操作系統(tǒng)同時(shí)應(yīng)用。
1) 對(duì) DPDK 應(yīng)用使用處理器核進(jìn)行隔離。
修改 Linux 的 OS 的 GRUB 參數(shù),設(shè)置 isolCPUs=16-23,40-47;2) 打開(kāi)運(yùn)行有 DPDK 進(jìn)程的處理器核上的 nohz_full。nohz_full 可以減少內(nèi)核的周期性時(shí)鐘中斷的次數(shù)。修改 Linux 的 OS 的 GRUB 參數(shù),設(shè)置 nohz_full=16-23,40-47;3) 關(guān)閉 NMI 監(jiān)控功能,減少 NMI 中斷對(duì) DPDK 任務(wù)的干擾。修改 Linux 的 OS 的 GRUB 參數(shù),設(shè)置 nmi_watchdog=0;4) 關(guān)閉 SELinux 功能修改 Linux 的 OS 的 GRUB 參數(shù),設(shè)置 selinux=0;5) 關(guān)閉處理器的 P 狀態(tài)調(diào)整和 softlockup 功能。將處理器鎖定在固定的頻率運(yùn)行,減少處理器在不同的 P 狀態(tài)切換帶來(lái)的處理時(shí)延。修改 Linux 的 OS 的 GRUB 參數(shù),設(shè)置 intel_pstate=disable nosoftlockup;6) 關(guān)閉圖形顯示,減少 GUI 應(yīng)用的干擾。調(diào)用命令 systemctl set-default multi-user.target;7) 關(guān)閉操作系統(tǒng)的中斷調(diào)度程序。調(diào)用命令 systemctl disable irqbalance.service;8) 關(guān)閉操作系統(tǒng)的審計(jì)服務(wù)。調(diào)用命令 systemctl disable auditd.service;9) 關(guān)閉藍(lán)牙服務(wù)。調(diào)用命令 systemctl disable bluetooth.service;10) 關(guān)閉 KVM 的內(nèi)存頁(yè)合并服務(wù)。調(diào)用命令 systemctl disable ksm.service;調(diào)用命令 systemctl disable ksmtuned.service;
11) 對(duì)于 KVM 虛擬的 vCPU 和物理 CPU 進(jìn)行綁定。使用 QEMU monitor 獲取 vCPU 對(duì)應(yīng)的線程號(hào),使用 taskset 命令進(jìn)行綁定。
2.3 OVS 性能問(wèn)題
OVS 作為 NFV 的一個(gè)重要組成模塊,會(huì)運(yùn)行在絕大多數(shù)的服務(wù)器節(jié)點(diǎn)上,提供虛擬機(jī)和虛擬機(jī)之間,以及虛擬網(wǎng)絡(luò)和物理網(wǎng)絡(luò)間的互連接口,其性能至關(guān)重要。OVS 2.4 開(kāi)始正式支持 DPDK 加速,相比傳統(tǒng)基于 Linux 內(nèi)核的 OVS 版本,轉(zhuǎn)發(fā)性能提高了數(shù)倍,為 VNF 在通用 x86 服務(wù)器上部署提供了有力支持。
OVS 缺省會(huì)為每一個(gè) NUMA 節(jié)點(diǎn)創(chuàng)建一個(gè) pmd 線程,該 pmd 線程以輪詢方式處理屬于其N(xiāo)UMA 節(jié)點(diǎn)上的所有 DPDK 接口。為了高性能,需要利用前面提到的 CPU 親和技術(shù),把 pmd 線程綁定在一個(gè)固定的 CPU core 上處理。此外,為了增加擴(kuò)展性,OVS 2.4 也支持網(wǎng)卡多隊(duì)列以及多 pmd 線程數(shù),這些參數(shù)均可動(dòng)態(tài)配置,但具體配置應(yīng)根據(jù)具體需求來(lái)決定。
3、內(nèi)存管理
如前所述,DPDK 考慮了 NUMA 以及多內(nèi)存通道的訪問(wèn)效率,會(huì)在系統(tǒng)運(yùn)行前要求配置Linux 的 HugePage,初始化時(shí)申請(qǐng)其內(nèi)存池,用于 DPDK 運(yùn)行的主要內(nèi)存資源。Linux 大頁(yè)機(jī)制利用了處理器核上的的 TLB 的 HugePage 表項(xiàng),這可以減少內(nèi)存地址轉(zhuǎn)換的開(kāi)銷(xiāo)。
3.1 內(nèi)存多通道的使用
現(xiàn)代的內(nèi)存控制器都支持內(nèi)存多通道,比如 Intel 的 E5-2600V3 系列處理器,能支持 4個(gè)通道,可以同時(shí)讀和取數(shù)據(jù)。依賴于內(nèi)存控制器及其配置,內(nèi)存分布在這些通道上。每一個(gè)通道都有一個(gè)帶寬上限,如果所有的內(nèi)存訪問(wèn)都只發(fā)生在第一個(gè)通道上,這將成為一個(gè)潛在的性能瓶頸。
因此,DPDK 的 mempool 庫(kù)缺省是把所有的對(duì)象分配在不同的內(nèi)存通道上,保證了在系統(tǒng)極端情況下需要大量?jī)?nèi)存訪問(wèn)時(shí),盡可能地將內(nèi)存訪問(wèn)任務(wù)均勻平滑。
3.2 內(nèi)存拷貝
很多 libc 的 API 都沒(méi)有考慮性能,因此,不要在高性能數(shù)據(jù)平面上用 libc 提供的 API,比如,memcpy()或 strcpy()。雖然 DPDK 也用了很多 libc 的 API,但均只是在軟件配置方面用于方便程序移植和開(kāi)發(fā)。
DPDK 提供了一個(gè)優(yōu)化版本的 rte_memcpy() API,它充分利用了 Intel 的 SIMD 指令集,也考慮了數(shù)據(jù)的對(duì)齊特性和 cache 操作友好性。
3.3 內(nèi)存分配
在某些情況下,應(yīng)用程序使用 libc 提供的動(dòng)態(tài)內(nèi)存分配機(jī)制是必要的,如 malloc()函數(shù),它是一種靈活的內(nèi)存分配和釋放方式。但是,因?yàn)楣芾砹闵⒌亩褍?nèi)存代價(jià)昂貴,并且這種內(nèi)存分配器對(duì)于并行的請(qǐng)求分配性能不佳,所以不建議在數(shù)據(jù)平面處理上使用類似malloc()的函數(shù)進(jìn)行內(nèi)存分配。
在有動(dòng)態(tài)分配的需求下,建議使用 DPDK 提供的 rte_malloc() API,該 API 可以在后臺(tái)保證從本 NUMA 節(jié)點(diǎn)內(nèi)存的 HugePage 里分配內(nèi)存,并實(shí)現(xiàn) cache line 對(duì)齊以及無(wú)鎖方式訪問(wèn)對(duì)象等功能。
3.4 NUMA 考慮
NUMA(Non Uniform Memory Access Architecture)與 SMP(Symmetric Multi Processing)是兩種典型的處理器對(duì)內(nèi)存的訪問(wèn)架構(gòu)。隨著處理器進(jìn)入多核時(shí)代,對(duì)于內(nèi)存吞吐量和延遲性能有了更高的要求,NUMA 架構(gòu)已廣泛用于最新的英特爾處理器中,為每個(gè)處理器提供分離的內(nèi)存和內(nèi)存控制器,以避免 SMP 架構(gòu)中多個(gè)處理器同時(shí)訪問(wèn)同一個(gè)存儲(chǔ)器產(chǎn)生的性能損失。
在雙路服務(wù)器平臺(tái)上,NUMA 架構(gòu)存在本地內(nèi)存與遠(yuǎn)端內(nèi)存的差異。本地和遠(yuǎn)端是個(gè)相對(duì)概念,是指內(nèi)存相對(duì)于具體運(yùn)行程序的處理器而言,如圖所示。
在 NUMA 體系架構(gòu)中,CPU 進(jìn)行內(nèi)存訪問(wèn)時(shí),本地內(nèi)存的要比訪問(wèn)遠(yuǎn)端內(nèi)存更快。因?yàn)樵L問(wèn)遠(yuǎn)端內(nèi)存時(shí),需要跨越 QPI 總線,在應(yīng)用軟件設(shè)計(jì)中應(yīng)該盡量避免。在高速報(bào)文處理中,這個(gè)訪問(wèn)延遲會(huì)大幅降低系統(tǒng)性能。尤其是傳統(tǒng)嵌入式軟件向服務(wù)器平臺(tái)遷移時(shí),需要特別關(guān)注。
DPDK 提供了一套在指定 NUMA 節(jié)點(diǎn)上創(chuàng)建 memzone、ring, rte_malloc 以及 mempool 的API,可以避免遠(yuǎn)端內(nèi)存訪問(wèn)這類問(wèn)題。在一個(gè) NUMA 節(jié)點(diǎn)端,對(duì)于內(nèi)存變量進(jìn)行讀取不會(huì)存在性能問(wèn)題,因?yàn)樵撟兞繒?huì)在 CPU cache 里。但對(duì)于跨 NUMA 架構(gòu)的內(nèi)存變量讀取,會(huì)存在性能問(wèn)題,可以采取復(fù)制一份該變量的副本到本地節(jié)點(diǎn)(內(nèi)存)的方法來(lái)提高性能。
4、CPU 核間無(wú)鎖通信
如果想建立一個(gè)基于消息傳遞的核間通信機(jī)制,可以使用 DPDK ring API,它是一個(gè)無(wú)鎖的 ring 實(shí)現(xiàn)。該 ring 機(jī)制支持批量和突發(fā)訪問(wèn),即使同時(shí)讀取幾個(gè)對(duì)象,也只需要一個(gè)昂貴的原子操作,批量訪問(wèn)可以極大地改善性能。
5、設(shè)置正確的目標(biāo) CPU 類型
DPDK支持CPU微架構(gòu)級(jí)別的優(yōu)化,可以通過(guò)修改DPDK配置文件中的CONFIG_RTE_MACHINE參數(shù)來(lái)定義。優(yōu)化的程度根據(jù)隨編譯器的能力而不同,通常建議采用最新的編譯器進(jìn)行編譯。
如果編譯器的版本不支持該款 CPU 的特性,比如 Intel AVX 指令,那么它在編譯時(shí)只會(huì)選用自己支持的指令集,這可能導(dǎo)致編譯 后生成的 DPDK 應(yīng)用的性能下降。
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9160瀏覽量
85427 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62622 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
261瀏覽量
24396 -
DPDK
+關(guān)注
關(guān)注
0文章
13瀏覽量
1725
原文標(biāo)題:干貨:DPDK技術(shù)架構(gòu)及性能影響因素
文章出處:【微信號(hào):算力基建,微信公眾號(hào):算力基建】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論