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