胡 煒,陽 春,李 文
(中國電子科技集團(tuán)公司第三十研究所,四川 成都 610041)
龍芯是中國科學(xué)院計(jì)算所自主研發(fā)的通用處理器,采用自主LoongISA 指令系統(tǒng),兼容MIPS 指令。目前系列芯片在政企、安全、金融、能源等應(yīng)用場景得到了廣泛的應(yīng)用。該系列芯片為通用處理器未針對(duì)網(wǎng)絡(luò)數(shù)據(jù)處理做特殊設(shè)計(jì),在應(yīng)用于網(wǎng)絡(luò)報(bào)文處理的安全產(chǎn)品時(shí),存在一定性能瓶頸。當(dāng)前廣為流行的數(shù)據(jù)平面開發(fā)套件(DPDK)針對(duì)通用處理器進(jìn)行設(shè)計(jì),減少不必要的I/O 開銷,更好的利用處理器運(yùn)算能力,實(shí)現(xiàn)了高性能網(wǎng)絡(luò)數(shù)據(jù)包處理。為此,本文嘗試對(duì)該套件在龍芯3A2000 平臺(tái)進(jìn)行移植以及性能對(duì)比測試。
龍芯3A2000/3B2000 以龍芯3A1000 四核框架結(jié)構(gòu)為基礎(chǔ),處理器核升級(jí)為新一代GS464E 架構(gòu),內(nèi)存控制升級(jí)為高性能激進(jìn)調(diào)度控制器,IO 總線升級(jí)至HT3.0,內(nèi)部互連網(wǎng)絡(luò)則進(jìn)行了大量的性能優(yōu)化。龍芯3A2000 處理器核心采用自主設(shè)計(jì)高性能GS464E 微結(jié)構(gòu),微結(jié)構(gòu)綜合技術(shù)水平達(dá)到了與Intel 的Ivy Bridge 及AMD 的Steamroller 相當(dāng)?shù)乃?。龍?A2000 支持自主龍芯指令系統(tǒng)LoongISA,在MIPS64 架構(gòu)500 多條指令的基礎(chǔ)上,在基礎(chǔ)指令、虛擬機(jī)指令、面向X86 和ARM 的二進(jìn)制翻譯指令、向量指令四個(gè)方面增加了近1400 條新指令。龍芯3A2000/3B2000 芯片在對(duì)龍芯3A1000 引腳兼容的基礎(chǔ)上,大幅提升了系統(tǒng)性能[1]。
該芯片于2015 年推出,而目前最新型號(hào)為龍芯3A4000,但其指令集與最新型號(hào)差異不大,程序完全可兼容運(yùn)行。同時(shí),由于其處理性能相對(duì)較差也能更好評(píng)估DPDK 在該平臺(tái)上的性能變化情況。
DPDK 全稱Intel Data Plane Development Kit,最初由Intel 公司開發(fā)的數(shù)據(jù)平面開發(fā)工具開發(fā)套件,代碼已經(jīng)開源并得到業(yè)界和愛好者的廣泛支持和應(yīng)用。最初該套件針對(duì)X86處理器開發(fā)也僅適配該架構(gòu)。目前,通過一系列適配開發(fā),官方已明確支持X86、Power、Arm 等處理器架構(gòu)。該套件為通用處理器架構(gòu)下用戶空間高效的數(shù)據(jù)包處理提供庫函數(shù)和驅(qū)動(dòng)的支持。由于該開發(fā)套件的成功,原用于網(wǎng)絡(luò)設(shè)備開發(fā)的網(wǎng)絡(luò)處理器,逐步被通用處理器替代[2]。
DPDK 運(yùn)行在Linux 操作系統(tǒng)的用戶空間,基于系統(tǒng)UIO 機(jī)制,實(shí)現(xiàn)在用戶空間上直接收發(fā)網(wǎng)絡(luò)數(shù)據(jù)包,繞過內(nèi)核對(duì)數(shù)據(jù)包處理,避免數(shù)據(jù)在內(nèi)核態(tài)與用戶態(tài)間的數(shù)據(jù)拷貝。相比原生Linux 內(nèi)核數(shù)據(jù)轉(zhuǎn)發(fā),采用DPDK 技術(shù)后能夠大幅提升網(wǎng)絡(luò)數(shù)據(jù)的轉(zhuǎn)發(fā)性能。同時(shí)由于整個(gè)業(yè)務(wù)處理均在用戶態(tài)進(jìn)行,大大方便了程序的開發(fā)、調(diào)試以及維護(hù)。
該開發(fā)套件主要具備以下技術(shù)特點(diǎn)[3]:
(1)UIO 技術(shù),在用戶空間直接從網(wǎng)卡收發(fā)數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)零拷貝。
(2)CPU 預(yù)取、數(shù)據(jù)包批處理機(jī)制,提高Cache 使用效率,降低數(shù)據(jù)處理時(shí)延。
(3)CPU 親和性設(shè)置,減少任務(wù)切換,并確保程序熱點(diǎn)一直處于Cache 中。
(4)大頁內(nèi)存技術(shù),提高Cache 命中率和內(nèi)存訪問速率。
(5)無鎖隊(duì)列技術(shù),避免數(shù)據(jù)在不同CPU 核間傳遞的鎖開銷。
DPDK 開發(fā)套件包含硬件抽象庫(EAL)、網(wǎng)卡輪詢驅(qū)動(dòng)、內(nèi)存池管理、無鎖隊(duì)列等一系列組件,其系統(tǒng)架構(gòu)如圖1 所示。
圖1 DPDK 架構(gòu)
從圖1中可以看出DPDK的EAL組件承上啟下,在內(nèi)核空間、用戶空間均有出現(xiàn),EAL 完成對(duì)各種硬件平臺(tái)、操作系統(tǒng)的適配工作,也是移植中需重點(diǎn)關(guān)注的部分。
本次移植基于DPDK17.11.4 版本進(jìn)行,代碼結(jié)構(gòu)如圖2 所示。
圖2 DPDK 代碼結(jié)構(gòu)
在DPDK 中新增架構(gòu)支持需調(diào)整config、lib、mk 目錄相關(guān)的配置文件、EAL 組件和編譯配置[4]。
下面將針對(duì)X86 架構(gòu)下的EAL 組件做進(jìn)一步分析,其組成如下:
(1)內(nèi)核態(tài)
EAL 組件在Linux 系統(tǒng)內(nèi)核中包括兩個(gè)模塊,igb_uio、kni。這兩個(gè)模塊與硬件平臺(tái)無關(guān)主要適配不同版本的Linux 內(nèi)核,其中igb_uio 用于實(shí)現(xiàn)對(duì)PCIE 網(wǎng)卡的UIO 訪問提供支持。
(2)用戶態(tài)
EAL 組件在用戶態(tài)的部分包括原子操作、字節(jié)序、CPU 時(shí)間標(biāo)簽計(jì)數(shù)器、內(nèi)存拷貝、預(yù)取操作、讀寫鎖、自旋鎖、向量指令、I/O 讀寫等等系列操作,與具體硬件相關(guān)代碼列表如表1 所示。
表1 EAL 組件硬件相關(guān)代碼列表
從上面的分析可知,實(shí)現(xiàn)DPDK 在不同硬件架構(gòu)的移植主要需解決:
(1)硬件架構(gòu)相關(guān)配置文件、編譯選項(xiàng)添加;
(2)EAL 內(nèi)核模塊移植;
(3)EAL用戶態(tài)組件的硬件架構(gòu)相關(guān)實(shí)現(xiàn)調(diào)整。
本次移植選用龍芯3A2000 處理器、Intel 公司支持DPDK 的82 580 千兆網(wǎng)卡,運(yùn)行龍芯公司提供的Loongnix 操作系統(tǒng),Linux 內(nèi)核版本為3.10。
在config 目錄中添加配置文件defconfig_mips-loongson3a-linuxapp-gcc,其中主要包括:
CONFIG_RTE_ARCH=”mips”
CONFIG_RTE_MACHINE=”loongson3a”
CONFIG_RTE_CACHE_LINE_SIZE=64
CONFIG_RTE_ARCH_64=y
在mk目錄中添加arch/mips/rte.vars.mk,machine/loongson3a/rte.vars.mk 文件,定義編譯相關(guān)選項(xiàng),其中主要包括:
ARCH ?=mips
RTE_OBJCOPY_TARGET=elf64-tradlittlemips
RTE_OBJCOPY_ARCH=mips:loongson_3a
MACHINE_CFLAGS +=-march=loongson3a
本次移植所選版本DPDK 開發(fā)套件可支持3.10版本的Linux 內(nèi)核,在內(nèi)核編譯添加UIO 功能支持后,igb_uio 模塊可直接編譯、運(yùn)行。由于所用龍芯平臺(tái)的內(nèi)核不支持MSI 中斷方式,需調(diào)整igb_uio代碼,使用legacy 中斷方式。
龍芯3A2000 處理器基于MIPS 架構(gòu),采用小端序,大頁內(nèi)存的頁大小為32 M,指令集也與X86存在較大的差異。
新建lib/librte_eal/common/include/arch/mips目錄,在目錄中添加并實(shí)現(xiàn)表1 中相關(guān)代碼,其中關(guān)鍵的是rte_atomic.h(原子操作),rte_cycles.h(CPU 時(shí)間標(biāo)簽計(jì)數(shù)器)。
注:本次移植暫不支持rte_vect.h(向量指令)。
(1)原子操作
原子操作包括內(nèi)存屏障函數(shù),16 位、32 位、64 位的原子加減、CAS 函數(shù)。這里以rte_atomic32_add 為例做說明,其龍芯平臺(tái)實(shí)現(xiàn)如圖3 所示[5-6]。
圖3 rte_atomic32_add 實(shí)現(xiàn)
(2)CPU 時(shí)間標(biāo)簽計(jì)數(shù)器操作
該操作用于快速獲得CPU 時(shí)間戳,可避免使用開銷較大的系統(tǒng)函數(shù)gettimeofday。這在數(shù)據(jù)包輪詢處理中非常有用。其函數(shù)為rte_rdtsc,實(shí)現(xiàn)如圖4 所示[5-6]。
圖4 rte_rdtsc 實(shí)現(xiàn)
其他組件的移植實(shí)現(xiàn)不再詳細(xì)敘述。
為評(píng)估DPDK 對(duì)龍芯平臺(tái)網(wǎng)絡(luò)數(shù)據(jù)轉(zhuǎn)發(fā)性能的影響情況,采用信爾泰網(wǎng)絡(luò)測試儀對(duì)Linux 內(nèi)核橋轉(zhuǎn)發(fā)、DPDK l2fwd 程序轉(zhuǎn)發(fā)的吞吐率進(jìn)行測試評(píng)估,評(píng)估基于RFC2544 進(jìn)行,包長包括64 字節(jié)、256字節(jié)、1280 字節(jié)。
Linux 內(nèi)核轉(zhuǎn)發(fā)配置如下:
(1)配置網(wǎng)橋
brctl addbr br
brctl addif br eth0
brctl addif br eth1
ifconfig br up
(2)啟用IP 轉(zhuǎn)發(fā)
echo 1 >/proc/sys/net/ipv4/ip_forward
測試結(jié)果如圖5 所示。
通過性能測試結(jié)果可以看出包長64 字節(jié)時(shí),轉(zhuǎn)發(fā)吞吐率僅為155 Mbps,距離2000 Mbps 的理論值相差巨大。同時(shí)通過查看詳細(xì)測試統(tǒng)計(jì),發(fā)現(xiàn)該字節(jié)包長情況下,稍超出155 Mbps 性能測試時(shí),丟包率已超過1%。這意味著已達(dá)到性能瓶頸,進(jìn)一步提升困難。
首先配置DPDK 運(yùn)行環(huán)境,通過usertools 目錄下的dpdk-setup.sh 進(jìn)行。配置網(wǎng)卡驅(qū)動(dòng)為igb_uio,配置大頁內(nèi)存數(shù)量為32(龍芯平臺(tái)頁大小為32 M)。l2fwd 運(yùn)行參數(shù)如下所示[7]:
l2fwd -c 0x6 -n 2 ---p 0x3
測試結(jié)果如圖6 所示。
圖5 內(nèi)核橋轉(zhuǎn)發(fā)吞吐率
圖6 l2fwd 轉(zhuǎn)發(fā)吞吐率
通過性能測試結(jié)果可以看出包長64 字節(jié)時(shí),轉(zhuǎn)發(fā)吞吐率已提升為551.58 Mbps,性能提升接近3.6倍。同時(shí)通過查看詳細(xì)測試情況,發(fā)現(xiàn)該字節(jié)包長情況下,稍超出551.58 Mbps 性能測試時(shí),丟包僅僅丟包100 多個(gè),丟包率小于萬分之一,平臺(tái)性能還存在進(jìn)一步提升空間。初步懷疑網(wǎng)卡收發(fā)包的緩沖不足導(dǎo)致在某個(gè)臨界值時(shí),無法緩存網(wǎng)絡(luò)報(bào)文進(jìn)而導(dǎo)致丟包。為此,修改l2fwd 程序,增加網(wǎng)卡緩存并再次進(jìn)行測試。
配置及l(fā)2fwd 運(yùn)行參數(shù)與5.2 章節(jié)保持一致,僅調(diào)整程序緩存大小。
性能測試結(jié)果如圖7 所示。
圖7 l2fwd 再次測試的轉(zhuǎn)發(fā)吞吐率
通過性能測試結(jié)果可以看出包長64 字節(jié)時(shí),轉(zhuǎn)發(fā)吞吐率再次提升,達(dá)到為692.2 mbps,性能提升相對(duì)內(nèi)核橋轉(zhuǎn)發(fā)達(dá)到4.5 倍。
本文針對(duì)DPDK 開發(fā)套件在龍芯平臺(tái)上進(jìn)行了移植,并進(jìn)行了網(wǎng)絡(luò)數(shù)據(jù)轉(zhuǎn)發(fā)吞吐率測試及對(duì)比分析。結(jié)果證明DPDK 可以在龍芯平臺(tái)上正常運(yùn)行,并且能將轉(zhuǎn)發(fā)性能提升接近5 倍。同時(shí)l2fwd 僅是簡單的數(shù)據(jù)報(bào)文轉(zhuǎn)發(fā)測試工具,不能很好利用處理器的多核運(yùn)算能力,平臺(tái)轉(zhuǎn)發(fā)性能具備較高的提升空間。因此,基于龍芯平臺(tái)開發(fā)網(wǎng)絡(luò)安全產(chǎn)品具備技術(shù)可行性,可滿足自主可控要求。