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