李 雷,焦 哲,原蓓蓓,艾 磊
(1.中國電子科技集團公司第三十研究所,四川 成都 610041;2.成都衛士通信息產業股份有限公司,四川 成都 610041)
隨著網絡技術的不斷發展,傳統的基于內核的報文收發方式造成大量的性能開銷,網絡傳輸速率很難得到提高。為了實現網絡的高速傳輸,Intel 設計了高性能的數據包處理框架 DPDK(Data Plane Development Kit)。近年來,通過不斷地對dpdk 技術進行改造,在國產申威處理器平臺上已實現了網絡數據的高速轉發[1]。
隨著國產多核處理器的普遍使用,高并發數據結構變得越來越重要[2]。為了充分發揮多核處理器的性能,軟件人員必須編寫可擴展的并發程序才能使其在多核環境下具有高的性能。并發程序編寫存在一個重要問題,就是多個線程/進程對共享資源的同步訪問問題。網絡安全設備多核并行協議棧運行過程中,不可避免地要在核間共享數據,比如:ddos 統計表,nat 轉換表,aspf 表等。保證數據一致性的通用方法是加鎖,但鎖機制的引入帶來了數據處理的串行化,大大降低了安全設備的網絡轉發性能,同時又增加死鎖和數據競爭的風險。近年來,工程人員開始對無鎖(lockfree)數據結構進行研究,使用CAS(compare and swap)細粒度同步原語的無鎖數據結構能夠擺脫死鎖和數據競爭問題,更重要的是它對多核是可擴展的[3]。
針對以上問題與現狀,結合對國產處理器平臺的研究與應用[4],本文提出了一種無鎖結構在國產防火墻上的應用方案。在并行處理的協議棧間使用無鎖結構進行數據共享,減少數據競爭時的等待時間,從而提高網絡轉發速率。實驗表明,該方案在小包(64 字節)數據轉發時,吞吐率性能比常規方法提升23.68%。
程序方法的調用到執行完成需要時間,從某個方法調用事件的開始到執行結束過程中,當這個方法調用事件開始而執行未結束,稱其調用是未決的。并發程序方法的執行可以相互重疊,而單線程程序方法的執行總是順序無重疊的。在一個程序中,當方法的未決調用能夠延遲其他方法的未決調用時,我們稱其是阻塞的;相反,當方法的未決調用不會延遲其他方法的未決調用時,我們稱其是非阻塞的。在一個程序中,一個方法的無限次調用能夠在有限次內完成,我們稱其是無鎖(lockfree)的;一個方法的每次調用都能在有限次內完成,我們稱其是無等待(waitfree)的;一個方法調用存在著關于它的操作次數的確定界限,我們稱其是有界無等待(waitfree bounded)的[3]。無鎖結構實現的方法也是無鎖的,其實現的基礎是CAS,且大多數國產處理器已硬件實現。CAS 可以保證需要更新的地址在沒有被其他線程或進程改動過的情況下安全地寫入新數據,保證讀寫操作的一致性,不出現臟數據。而這個地址內存空間也是我們通常在鎖機制中需要加鎖重點保護的。
基于dpdk 技術的國產防火墻架構如圖1 所示。

圖1 國產防火墻架構
該防火墻在國產化多核處理器核和國產化多隊列網卡的基礎上,對dpdk 技術進行改造,構建一個高速的二層轉發平臺。在dpdk 驅動上構建一個多核并行運行的用戶態協議棧,各協議棧與處理器核綁定且獨立運行,并行協議棧間通過共享數據進行傳遞信息,運用無鎖結構及其操作進行數據同步,保證一致性。
(1)初始化
設備上電啟動過程中,由協議棧0 所運行的線程或進程在dpdk 大頁中使用rte_memzone_reserve方法申請共享內存,并進行初始化。
(2)共享數據的獲取
協議棧并行運行時,各個協議棧使用rte_memzone_lookup 方法獲取共享內存,再根據其具體使用的數據結構方法獲取所需的數據。比如:hash表可通過hash 值獲取。
(3)共享數據的更新
各個協議棧在獲取共享內存后采用無鎖機制對共享數據進行操作。無鎖化機制的核心原語為CAS,其在大多數國產處理器中已經實現。比如龍芯平臺的CAS 原語實現方法如下:


在應用程序的線程或進程中,對64 位共享數據的更新方法如下:

其中A 為被更新的數據,A*為更新后的數據。
相比于加鎖的方式,采用硬件原語CAS 實現的無鎖數據結構在進行操作時,將縮短數據競爭時的等待時間,從而提高網絡轉發速率。在程序運行的整個周期中,數據競爭等待時間減少,則并行可執行部分將變大。著名的阿姆達爾定律指出:數據結構并發程序的優化取決于并發可執行部分占整個程序的比例和并發線程數,其表達式如下[5]:

其中,S為程序加速比,n為并發線程數,P為并發可執行部分。當并發線程數n一定時,并發可執行部分P越大,則程序加速比S越大。
無鎖結構降低了數據競爭的等待時間,則增大了程序并發可執行部分,進而提高了程序加速比。程序加速比的提高,使并行協議棧的網絡處理能力增強。
實驗硬件平臺采用8 核龍芯3A3000 處理器,主頻1399MHz,PCIE 接口為4 口、8 隊列SF400T千兆網卡,中標麒麟操作系統。
采用spirent testcenter 儀表進行rfc2544 吞吐率測試。多核并行協議棧環境下,核間數據競爭,將有鎖機制與無鎖機制下的吞吐率進行對比。實驗采用dpdk 提供的共享內存rte_memzone,dpdk 讀寫鎖rte_rwlock_write_lock,cas64 原語及無鎖方法。實驗分別測試udp 包長為64 字節、128 字節、256 字節、512 字節、1024 字節、1280 字節、1518 字節時的網絡吞吐率,其儀表連接關系如圖2 所示。

圖2 實驗儀表連接示意圖
Spirent TestCenter 的PORT1 和PORT2 通過直連網線與國產防火墻的ETH1 和ETH2 相連。
實驗采用統計UDP 目的端口包數的方法使共享數據產生競爭,處理器核數為8,端口數為4 且儀表使用遞增的方式發包,則理論上同一時刻有2個線程或進程競爭一個數據,此時測得結果如表1所示:

表1 吞吐率結果表
防火墻在全速轉發的情況下,無鎖結構同步機制比加鎖結構同步機制的性能在包長64 字節時提升23.68%,包長128 字節時提升22.61%。包長為256、512、1024、1280、1518 時,無鎖結構的同步機制與加鎖結構的同步機制轉發速率均達到限速。
按照圖2 儀表連接方法,儀表以1Gb/s 速度發送500000 包的同時,防火墻程序記錄下并發不可執行部分(更新共享數據)所消耗的時間。程序使用CPU 的運行周期作為時間單位進行統計,將加鎖和無鎖環境下更新共享數據所消耗的時間進行對比,其測試結果如表2 所示。

表2 時間消耗表
從實驗結果可以看出,無鎖環境更新共享數據所消耗的時間短于有鎖環境,則根據阿姆達爾定律可知,多核并行協議棧并行可執行部分大,程序加速比高,有利于網絡轉發性能的提高。
本文在國產化背景下,提出了一種無鎖結構在國產防火墻上的應用方案。實驗表明,其提高了防火墻在實際工作中的網絡吞吐率,且為后續構建國產化高速網絡安全平臺提供指導。尤其是無鎖化共享數據結構的應用進一步提高了防火墻這類安全設備的實際網絡吞吐率。但是,本方案在設計和實驗過程中并未針對ABA 問題進行分析,這是后續工作中需要研究的要點之一。