DPDK性能影響因素分析
?
上篇請(qǐng)參閱“DPDK技術(shù)原理與架構(gòu)”,本篇為下篇。介紹基于 DPDK 進(jìn)行應(yīng)用開(kāi)發(fā)和環(huán)境配置時(shí),應(yīng)用程序性能的影響因素以及相應(yīng)的 優(yōu)化調(diào)整方法。這些因素并非必然劣化性能,可能因硬件能力、OS 版本、各類(lèi)軟硬環(huán)境參數(shù)配置等的差異產(chǎn)生較大波動(dòng),或者存在較大的不穩(wěn)定性,相關(guān)的調(diào)優(yōu)方法需要用戶(hù)結(jié)合自身的VNF應(yīng)用部署在實(shí)踐中不斷完善。
更多關(guān)于DPDK技術(shù)內(nèi)容請(qǐng) 參考“ 《中國(guó)電信DPDK技術(shù)白皮書(shū)v1.0》 ”。
中國(guó)電信DPDK技術(shù)白皮書(shū)v1.0 DPDK基礎(chǔ)—認(rèn)識(shí)DPDK技術(shù) DPDK架構(gòu)高清版 DPDK編程指南(中文版)
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)文的線(xiàn)速到達(dá)率為 14.88Mpps,如果實(shí)現(xiàn)零丟包的線(xiàn)速處理, 每個(gè)報(bào)文的平均處理速度應(yīng)該小于 1/14.48Mpps=67us,DPDK 應(yīng)用的網(wǎng)卡收發(fā)包隊(duì)列長(zhǎng)度缺 省配置為 128,網(wǎng)卡隊(duì)列填充滿(mǎn)的時(shí)間是 128*67=8579us。也就是說(shuō),DPDK 的業(yè)務(wù)進(jìn)程,如果被操作系統(tǒng)中斷超過(guò) 8579us,就會(huì)導(dǎo)致網(wǎng)卡收發(fā)報(bào)的隊(duì)列被充滿(mǎn),無(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)的線(xiàn)程號(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 線(xiàn)程,該 pmd 線(xiàn)程以輪詢(xún)方式處理屬于其 NUMA 節(jié)點(diǎn)上的所有 DPDK 接口。為了高性能,需要利用前面提到的 CPU 親和技術(shù),把 pmd 線(xiàn) 程綁定在一個(gè)固定的 CPU core 上處理。此外,為了增加擴(kuò)展性,OVS 2.4 也支持網(wǎng)卡多隊(duì)列以及多 pmd 線(xiàn)程數(shù),這些參數(shù)均可動(dòng)態(tài)配置,但具體配置應(yīng)根據(jù)具體需求來(lái)決定。
4、 內(nèi)存管理
如前所述,DPDK 考慮了 NUMA 以及多內(nèi)存通道的訪(fǎng)問(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)。
4.1 內(nèi)存多通道的使用
現(xiàn)代的內(nèi)存控制器都支持內(nèi)存多通道,比如 Intel 的 E5-2600V3 系列處理器,能支持 4 個(gè)通道,可以同時(shí)讀和取數(shù)據(jù)。依賴(lài)于內(nèi)存控制器及其配置,內(nèi)存分布在這些通道上。每一 個(gè)通道都有一個(gè)帶寬上限,如果所有的內(nèi)存訪(fǎng)問(wèn)都只發(fā)生在第一個(gè)通道上,這將成為一個(gè)潛 在的性能瓶頸。
因此,DPDK 的 mempool 庫(kù)缺省是把所有的對(duì)象分配在不同的內(nèi)存通道上,保證了在系 統(tǒng)極端情況下需要大量?jī)?nèi)存訪(fǎng)問(wèn)時(shí),盡可能地將內(nèi)存訪(fǎng)問(wèn)任務(wù)均勻平滑。
4.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 操作友好性。
4.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ù)平面處理上使用類(lèi)似 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ú)鎖方式訪(fǎng) 問(wèn)對(duì)象等功能。
4.4 NUMA 考慮
NUMA(Non Uniform Memory Access Architecture)與 SMP(Symmetric Multi Processing) 是兩種典型的處理器對(duì)內(nèi)存的訪(fǎng)問(wèn)架構(gòu)。 隨著處理器進(jìn)入多核時(shí)代,對(duì)于內(nèi)存吞吐量和延遲 性能有了更高的要求,NUMA 架構(gòu)已廣泛用于最新的英特爾處理器中,為每個(gè)處理器提供分 離的內(nèi)存和內(nèi)存控制器,以避免 SMP 架構(gòu)中多個(gè)處理器同時(shí)訪(fǎng)問(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)存訪(fǎng)問(wèn)時(shí),本地內(nèi)存的要比訪(fǎng)問(wèn)遠(yuǎn)端內(nèi)存更快。因?yàn)?/span> 訪(fǎng)問(wèn)遠(yuǎn)端內(nèi)存時(shí),需要跨越 QPI 總線(xiàn),在應(yīng)用軟件設(shè)計(jì)中應(yīng)該盡量避免。 在高速報(bào)文處理中, 這個(gè)訪(fǎng)問(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)存訪(fǎng)問(wèn)這類(lèi)問(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)提高性能。
5、CPU 核間無(wú)鎖通信 如果想建立一個(gè)基于消息傳遞的核間通信機(jī)制,可以使用 DPDK ring API,它是一個(gè)無(wú) 鎖的 ring 實(shí)現(xiàn)。該 ring 機(jī)制支持批量和突發(fā)訪(fǎng)問(wèn),即使同時(shí)讀取幾個(gè)對(duì)象,也只需要一個(gè) 昂貴的原子操作,批量訪(fǎng)問(wèn)可以極大地改善性能。
6 設(shè)置正確的目標(biāo) CPU 類(lèi)型
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)用的性能下降。

轉(zhuǎn)載申明:轉(zhuǎn)載 本號(hào)文章請(qǐng)注明作者和來(lái)源,本號(hào)發(fā)布文章若存在版權(quán)等問(wèn)題,請(qǐng)留言聯(lián)系處理,謝謝。
推薦閱讀
更多架構(gòu)相關(guān)技術(shù)知識(shí)總結(jié)請(qǐng)參考“架構(gòu)師全店鋪技術(shù)資料打包”相關(guān)電子書(shū)(37本技術(shù)資料打包匯總詳情可通過(guò)“ 閱讀原文 ”獲取)。
全店內(nèi)容持續(xù)更新,現(xiàn)下單“架構(gòu)師技術(shù)全店資料打包匯總(全)”,后續(xù)可享全店內(nèi)容更新“免費(fèi)”贈(zèng)閱,價(jià)格僅收198元(原總價(jià) 350 元)。
溫馨提示:
掃描 二維碼 關(guān)注公眾號(hào),點(diǎn)擊 小程序 鏈接 獲取 “ 架構(gòu)師技術(shù)聯(lián)盟書(shū)店 ” 電子書(shū)資料詳情 。

