景 陽 盧子晉 姜海洋 張廣興 曾 彬
1.江蘇省未來網絡創新研究院;2.吉林大學通信工程學院;
3.中國科學院計算技術研究所;4.湖南友道信息技術有限公司
為了監測和防御網絡入侵行為,網絡中部署了大量的安全設備,如網絡流量分析(Network Traffic Analysis,NTA)系統、入侵防御檢測系統、防火墻等。隨著網絡帶寬的快速增長,安全設備面臨嚴峻的性能挑戰。目前針對網絡安全設備性能提升及擴展性問題的研究,大多集中在算法優化層面,如針對硬件資源的調度算法優化、針對具體業務層面的算法優化等,但是在生產環境中,所有資源都接近滿負荷運行的情況下,各種調度算法就不能很好地發揮效果了。本研究以江蘇省未來網絡創新研究院建設的未來網絡實驗設施(China Environment for Network Innovations,CENI)中的NTA 系統為例,分析如何在多核、眾核處理器上獲得可擴展的流量處理能力。NTA 的系統架構是典型的安全設備系統架構,本研究通過分析NTA 的業務特性和使用場景,得出影響NTA 系統處理能力擴展性的兩個主要方面:硬件層面的資源競爭問題和軟件層面的資源競爭。然后從硬件和軟件兩個層面對NTA 系統的性能擴展性提出相應的優化方法。通過該方法,CENI 網管的NTA 探針子系統獲得了200 Gbps 的處理能力。本研究提出的方法同樣也可以應用到防火墻、入侵防御、入侵檢測等安全設備中。
在硬件層面,影響NTA 系統處理能力及擴展性的主要是處理器、三級緩存、內存、PCIe 網卡的工作方式。這些硬件之間的協作關系如圖1 所示。對系統處理能力的影響主要有兩個方面:一是報文在PCIe 網卡和內存之間傳遞時,跨NUMA 節點處理報文造成的性能消耗;二是內存和處理器之間的三級緩存占用不均勻,產生大量緩存不命中現象造成的性能消耗。

圖1 處理器系統架構圖
如何使用這些硬件設備才能使系統整體性能達到最優?學者們給出了一些解決方法,如,(1)Peter Zijlstra 等人提出的使用任務本地節點化來減少非本地內存訪問頻率的方法;(2)Mohammad Dashti 提出的使用優化算法“Carrefour”解決內存控制器和NUMA 節點互聯中擁塞問題的方法;(3)intel DPDK 中對三級緩存的使用做的各種優化。但是這些方法都不能很好地解決NTA 系統中硬件最優化使用的問題。因為在NTA 業務場景中,通常需要接收、處理大量網絡報文,這幾乎可以消耗掉系統上所有的硬件資源,所以無論算法怎樣合理,都會出現任務分配不均、數據擁塞等問題。因此,基于算法和系統自由調度的方式做的優化效果就會失效,從而使系統整體處理能力下降。所以還是希望能夠根據設備的硬件特征自由配置特定的NTA 系統。
在軟件層面,影響NTA 系統處理能力及擴展性的主要是NTA 系統的業務處理模型。NTA 的基礎業務數據處理流程如圖2 所示。其業務模型主要包括業務處理模塊和數據維護兩個方面。業務處理模塊,指的是NTA 系統中負責特定業務功能的函數的集合組成的一個系統調用。NTA 業務主要的業務處理模塊包括:報文采集、報文解析、流信息處理、流信息掃描、流信息導出等等。數據維護,主要指流數據維護。流數據不僅是各個業務模塊處理的核心數據,還是其他重要數據間的橋梁,因此流數據的維護和管理是NTA 系統數據維護的核心。正是因為各個業務處理模塊對數據操作的競爭關系,以及流數據的全局橋梁作用,影響了多線程架構的NTA 系統的性能擴展能力。

圖2 NTA 基礎業務數據處理流程圖
要解決軟件層面的資源競爭問題,主要是解決流表操作的沖突問題。人們給出了一些解決方法,如,(1)開源項目Suricata 中使用的擴大流表存儲量,減少沖突概率的方法:(2)張建宇等人提出的使用多張流表按照某種方法做倒換使用的方法。這兩種方法雖然可以緩解或者避免流表使用沖突,但是耗費了大量緩存,增加了I/O 開銷。在流節點數量龐大的NTA 環境中,成本增長的流表緩存和I/O 開銷,會使NTA 設備難以支撐。
綜上所述,在NTA 這種特定類型的系統應用上,目前硬件層面已有的優化方法達不到想要的效果,而在軟件層面已有的一些優化方法,在生產實踐中的資源使用性價比又比較低。因此,本研究針對NTA 業務的特殊性以及在生產實踐中的資源使用性價比和可行性,提出了對軟件和硬件分別做優化的方法來解決上述問題。
本研究設計了一套基于DPDK 的收包可擴展框架,來解決硬件層面上各種資源使用策略及競爭問題。收包可擴展框架圖如圖3 所示。所謂框架是指一種基于模塊化設計軟件應用的場景,按照特定策略,設置、編排軟件模塊的全局層面的部署方式。此收包框架包括:信息提取器、模塊編排器、模塊部署裝置。信息提取器的主要功能是:收集運行設備的硬件信息。模塊編排器的主要功能是:按照收集到的硬件信息,根據預制的模塊設置、編排模型,得出部署要使用的模塊類型、模塊個數、以及相互之前的協作關系。模塊部署裝置:根據模塊編排器給出的模塊設置參數,啟動、運行、監控各個功能模塊。

圖3 收包可擴展框架系統圖
這套收包框架的重點是“模塊編排器”,其工作重點就是為了解決硬件層面的資源競爭問題,其輸入是硬件設備信息,輸出是業務模塊部署時使用的各種參數。編排器的輸入參數為:(1)PCIe 網卡所在NUMA、吞吐量、硬件特性;(2)處理器所在NUMA、總核數、單個NUMA 中核數、單核性能參數;(3)三級緩存分布情況、共享核數;(4)內存所在NUMA、大小。經過編排器得到的參數為:(1)使用到的系統模塊類型,各個模塊占用的核號及數量;(2)申請內存的節點位置及大小。對于給定的硬件資源,綜合了生產實踐中經常使用到的NTA 業務模塊的排布使用方式,預設了一些模塊編排方法,后續也會根據生產實踐需要,不斷完善和豐富模塊編排器的編排策略,且模塊編排器的修改并不會影響框架的其他部分。
本系統以動態庫的形式實現了收包框架,提供對外接口給NTA 系統使用。配置NTA 系統時,根據系統的硬件信息配置參數,系統啟動時會按照配置的參數,根據策略運行指定的收包及分發模式。
模塊編排器從硬件信息需要得到系統啟動的準備工作指的是信息提取器獲取到設備信息,將設備信息輸入編排器得到系統啟動參數,并啟動系統的過程。
首先,信息提取器需要獲取的硬件信息包括:網卡端口的流量采集能力、網卡收包隊列的最大個數、處理器框架結構、內存分布情況及容量大小、共享三級緩存與對應的處理器核心信息。其中,網卡端口的流量采集能力代表可以接入系統的總流量大小;網卡收包隊列的最大個數決定了每個端口的流量最多可以分成多少份;處理器框架結構及共享三級緩存與對應的處理器核心,決定了系統接入的流量如何分布在各個處理器核心上做處理;處理器的處理能力決定了單個處理器核心可以處理的報文量;內存分布情況及容量大小決定了可以申請的內存節點及大小。
其次,模塊編排器從硬件信息需要得到的配置參數包括:(1)網卡初始化相關的參數:需要使用的端口、端口個數、端口啟用的硬件隊列個數、端口隊列可容納的報文個數等;(2)收包線程設置相關的參數:是否需要單獨開設收包線程、線程個數及使用的邏輯核號等;(3)業務線程設置相關的參數:啟用哪些業務線程、各種業務線程個數、是否綁核等;(4)報文轉發方式相關的參數:丟棄、轉發到指定端口、投遞到共享內存給其他進程使用。
最后,模塊部署裝置按照啟動信息,設置網卡、內存,啟動收包線程、監控線程、掃描線程、信息導出線程,設置業務處理線程個數,等待收包。各個啟動線程定義如下:
(1)收包線程定義:是本系統動態庫創建的,直接調用DPDK 收包接口,并將DPDK 的報文結構轉換成本系統動態庫自有的報文結構的線程,此線程主要的工作是從DPDK 驅動層接受報文,然后根據配置需要做些簡單的統計、解析工作。
(2)監控線程定義:是本系統動態庫創建的,負責監控系統狀態、連接狀態、端口狀態并定期輸出狀態信息的一類線程。
(3)掃描線程定義:非本系統動態庫創建的,負責定期掃描、老化流表信息,并將流信息組織成固定輸出格式的線程。
(4)信息導出線程定義:非本系統動態庫創建的,負責導出動態庫統計、收集的報文層次的基礎信息的線程。
(5)業務處理線程定義:非本系統動態庫創建的,專門做NTA 復雜業務解析的線程。但此線程的個數由本系統動態庫設置并傳遞給創建此線程的進程,此線程的主要工作包括創建流表、做深層次的報文解析、做流量測量等工作。
收包分配策略是按照配置文件具體參數部署收包模型的策略。策略設置是根據DPDK 的特性,以及實踐中的使用習慣設置的,需要不斷積累和調整。這里只介紹三種NTA 系統中常用的收包分配策略。
(1)針對小流量場景,一般情況是收包線程數量小于收包端口數量。可以按照端口數量,為系統分配1-2 個收包線程,然后再由收包線程將流量均衡地分配到多個業務線程。
(2)針對大流量、業務負載重的場景,一般情況是合并收報線程和業務線程。可以按照端口流量大小,為每個端口分配多個處理線程,每個處理線程均使用運行到完成(Run To Completion,RTC)的處理方式。
(3)針對單核處理能力差但是總核數多的場景,一般需要充分利用設備的硬件特性,盡量將業務模塊分散到多個CPU 線程中去,盡可能達到負載均衡的效果。
本研究提出了一種基于硬件的資源分區的競爭消除方法,來解決軟件層面上的資源競爭問題。系統結構圖如圖4 所示。主要包括以下三個方面:(1)對流節點管理方式做了改造。對流表劃分了兩級區域,第一級以收包端口為單位劃分區域,第二級以端口對應的收報線程為單位劃分區域,因此每個業務處理線程只從對應的流表區域獲取、歸還流節點,從而消除各個業務處理線程之間的沖突。(2)對流表的掃描方式做了相應的改造。以端口為單位創建掃描線程,做分區掃描,按照預估的端口流量情況,通過配置為每個端口創建1 個或多個掃描線程,減輕了整體掃描的負擔。(3)對數據的導出方式做了改造。按照不同的分區,通過配置預設的方式,增加導出線程數量、壓縮導出數據,以此增加導出能力。
為了實現流表添加、刪除的無鎖操作,本系統對流表做了區域劃分管理,見圖4 綠色的流表存儲結構。以下將從流節點內存管理和流節點使用兩個方面來描述對流表管理方式的優化。

圖4 系統結構圖
(1)流節點內存管理。設計了一種無鎖的流節點內存池管理結構。流節點存儲使用的是一個二維數組全局變量,行數是鏈路個數,列數是業務處理線程個數,其中每一個節點維護一條Flow 類型的鏈表,鏈表存儲的是預先申請的流節點內存。按照配置設置流節點數量的分配規則,整個內存是初始化的時候一次性申請好的。這種內存管理方式可以使每個業務處理線程、每條鏈路都有自己獲取流節點的區域,所以獲取流節點時不需要加鎖。
(2)流節點使用。基于上述流節點內存管理方式,設計了一種將沖突最小化的流節點使用方式。先按照鏈路創建管理流表的哈希表,再結合業務線程數量、業務特征等為此哈希表劃分區域。產生分區的哈希鍵值需要對原始的經過計算得到的哈希鍵值再做一次轉化,原始哈希鍵值可以轉化為“每個線程可使用的哈希桶個數乘以線程號,再加上原始哈希鍵值對每個線程可使用的哈希桶個數取余得到的數值”的形式。。這樣做的原因是為了將流表維護及使用過程中的沖突限定在某一個掃描線程和某一個業務處理線程中。
針對上節實現的流表管理方式,設計了一種基于端口的流表掃描、信息存儲機制,將流表操作的沖突限制在最小的范圍,見圖4 粉色的掃描線程和黃色流信息存儲結構。流節點管理的最終目的是為了從有效的流節點中獲取各種統計信息,所以需要創建與業務處理線程并行處理的掃描線程搜集要導出的各種信息。隨著業務量越來越重,要搜集的信息也越來越多,掃描線程個數也需要相應的增加,而制定掃描線程個數設置策略的時候,也需要考慮流表使用沖突的問題。這里流表增刪與流表掃描的沖突問題無法完全解決,只能盡量將其沖突最小化。綜合上面的流表管理方式,本研究的處理方式是:為每條鏈路設置1 個或多個掃描線程,每隔一段時間掃描、老化一次哈希表中的流節點,并且拼裝要導出的信息。每條鏈路的掃描線程個數,要依據流節點數量和處理器處理能力的經驗值來設置。比如,如果這條鏈路產生的流節點較少且處理器處理能力強,則只需要設置一個掃描線程,如果這條鏈路產生的流節點數量很大且處理器處理能力又弱,則設置多個掃描線程。這種線程部署方式,將流表使用沖突限制在了每個基于端口的流表的一個業務處理線程和一個掃描線程之間,并且流表鎖的范圍是一個沖突鏈。
針對上節實現的流掃描、信息搜集機制,設計了一種與之相匹配的日志導出機制,見圖4 藍色的導出線程和黃色流信息存儲結構。NTA 系統要導出的數據量非常大,通常是要每隔一段時間導出幾百萬乃至上千萬條流數據,并且每條流的數據長度可多達上千字節長度。所以為了提升擴展性,一般也會增設多個導出線程。本系統設計的日志導出機制從兩個方面考慮:一是設置合理的導出線程數量及導出方式;二是將導出的數據做壓縮來減輕單線程導出負擔。導出線程的設置策略方面,與掃描線程一一對應,掃描線程將拼裝的數據存儲到輸出隊列中,導出線程定時檢測隊列中是否有數據,有數據則導出。另一方面,根據策略來設置是否要將數據做壓縮,經過對各種壓縮算法比較,綜合考慮壓縮率和壓縮時間,我們最終選擇使用Lz4 壓縮算法來對單條流數據做壓縮,通過壓縮的方式可提升30%數據導出量。
綜上三節的實現方式,可以做到流表的管理使用、掃描、信息導出,按照端口劃分是完全獨立的,并且在每個端口內部流量處理時沖突縮減到最小化。再加上硬件資源也可以按照端口獨立,理論上我們的系統在對流量的處理、信息搜集導出能力上,是可以達到以增加不同端口接入流量的方式來使得系統處理能力線性擴展的。為了驗證本研究設計的NTA 系統的處理能力以及性能擴展能力,找到了一款硬件資源相對獨立的海光設備來做驗證。
為了驗證本系統處理能力及性能擴展性,選擇了一款PCIe 網口數量較多、處理器核數較多、NUMA 節點較多、共享三級緩存對應的核較少、資源比較獨立的海光設備作驗證。
海光服務器硬件信息如下:(1)面板口信息:2 個100Gbps 的面板口。(2)處理器信息:型號為Hygon C86 7185 32-core Processor,2 座處理器,處理器為NUMA 架構,1 座處理器會分成4 個NUMA,每個NUMA 是8 個物理核心。(3)FPGA 芯片信息:共2 個FPGA 芯片,做報文分發。(4)PCIe號虛擬出來的口:每個虛擬口2 個收包隊列。(5)面板口、FPGA 芯片、PCIe 號虛擬出來的口、內存、處理器之間的關系:1 個面板口對應1 個FPGA 芯片,1 個FPGA 芯片通過8 個PCIe 號虛擬出來的口,與一個處理器連接,此處理器有4 個NUMA 節點,2 個PCIe 號虛擬出來的口對應一個NUMA 節點。
針對上述硬件信息,首先用模塊編排器進行編排。得到下面的結果:(1)在每個NUMA 上申請2G 巨頁;(2)在每個NUMA 上,按照共享三級緩存的邏輯核,將1 個NUAM上的所有邏輯核分為2 組,則每組8 個邏輯核,將這8 個邏輯核分給1 個PCIe 口使用;(3)1 個PCIe 口對應的8 個邏輯核的使用方式是:設置2 個收包核、4 個業務處理核、1 個流表掃描核、1 個數據導出核;(4)設置16 個掃描線程、16 個導出線程、1 個監控線程。
之后用模塊部署裝置,根據收包分發策略及流節點掃描導出策略,設置系統運行模型。
使用測試儀構造各種不同長度TCP 和UDP 流量,測試優化后的NTA系統的處理能力及擴展能力,測試結果如表1所示。關于性能對比實驗,不僅對優化前后的NTA 系統做了對比,而且還選用了一款具有代表性的、使用比較普遍的、開源的NTA 系統suricata,與優化后的NTA 系統做了對比。在使用suricata 做對比實驗的時候,對suricata 的整體負載能力做了調整,使其與優化后的NTA 系統在單核處理能力上接近一致,這樣做是為了使兩者的對比實驗更有可比性。對比結果如圖5所示。

圖5 三種NTA 系統處理能力對比

表1 優化后的NTA 系統處理能力
首先,對比在1 個NUMA 中增加處理器線程數是否可以使系統處理能力線性增加。根據表1 前兩列測試結果可得:
(1)處理64 字節的TCP、UDP 流量。使用1 個NUMA中8 個線程,處理125 萬流節點的能力是1.5Gbps;使用1 個NUMA 中16 個線程,處理250 萬流節點的能力是3Gbps。所以在1個NUMA中對64字節流量處理能力是可以達到線性增長的。
(2)處理512 字節的TCP、UDP 流量。使用1 個NUMA中8 個線程,處理125 萬流節點的能力是9Gbps;使用1 個NUMA 中16 個線程,處理250 萬流節點的能力是18Gbps。所以在1 個NUMA 中對512 字節流量處理能力是可以達到線性增長的。
(3)處理混合字節的TCP、UDP 流量。使用1 個NUMA中8 個線程,處理125 萬流節點的能力是13Gbps;使用1 個NUMA 中16 個線程,處理250 萬流節點的能力是25Gbps。所以在1 個NUMA 中對混合字節流量處理能力是可以達到近似線性增長的。
(4)處 理1518 字 節 的TCP、UDP 流 量。使 用1 個NUMA 中8 個線程,處理125 萬流節點的能力是26Gbps;使用1 個NUMA 中16 個線程,處理250 萬流節點的能力是50Gbps。所以在1 個NUMA 中對1518 字節流量處理能力是可以達到近似線性增長的。
由上述實驗結果可以證明,優化后的系統在1 個NUMA中增加處理器線程數可以使系統處理能力達到近似線性增加的效果。
其次,對比增加不同NUMA 節點中的處理器線程數是否可以使系統處理能力線性增加。此型號設備共有8 個NUMA,每個NUMA 中有16 個處理器線程。表1 中16 個處理器線程使用的是1 個NUMA 中的所有線程、32 個處理器線程使用的是2 個不同NUMA 中的所有線程、64 個處理器線程使用的是4 個不同NUMA 中的所有線程、128 個處理器線程使用的是8 個不同NUMA 中的所有線程。根據表1 后四列測試結果可得:
(1)處理64 字節的TCP、UDP 流量。使用1 個NUMA節點處理250 萬流節點的能力是3Gbps;使用2 個NUMA 節點處理500 萬流節點的能力是5Gbps;使用4 個NUMA 節點處理1000 萬流節點的能力是10Gbps;使用8 個NUMA 節點處理2000 萬流節點的能力是20Gbps。所以在多NUMA 中處理64 字節流量可以達到近似線性增長。
(2)處理512 字節的TCP、UDP 流量。使用1 個NUMA節點處理250 萬流節點的能力是18Gbps;使用2 個NUMA 節點處理500 萬流節點的能力是34Gbps;使用4 個NUMA 節點處理1000 萬流節點的能力是68Gbps;使用8 個NUMA 節點處理2000 萬流節點的能力是134Gbps。所以在多NUMA 中處理512 字節流量可以達到近似線性增長。
(3)處理混合字節的TCP、UDP 流量。使用1 個NUMA節點處理250 萬流節點的能力是25Gbps;使用2 個NUMA 節點處理500 萬流節點的能力是50Gbps;使用4 個NUMA 節點處理1000 萬流節點的能力是100Gbps;使用8 個NUMA 節點處理2000 萬流節點的能力是200Gbps。所以在多NUMA 中處理混合字節流量可以達到近似線性增長。
(4)處 理1518 字 節 的TCP、UDP 流 量。使 用1 個NUMA 節點處理250 萬流節點的能力是50Gbps;使用2 個NUMA 節點處理500 萬流節點的能力是100Gbps;使用4 個NUMA 節點處理1000 萬流節點的能力是200Gbps。所以在多NUMA 中處理1518 字節流量可以達到近似線性增長,并且遠遠沒有達到系統的最大處理能力。
由上述實驗結果可以證明,在多NUMA 系統中優化后的系統處理能力也是近似線性增加的。
對比圖說明:(1)圖5(a)、(b)、(c),使用的16個處理器線程是NUMA 0 中的;使用的32 個處理器線程是NUMA 0-1 中的;使用的64 個處理器線程是NUMA 0-4 中的;使用的128 個處理器線程是NUMA 0-7 中的。(2)圖5(d),由于報文長度較長,優化后的系統可以只使用NUMA 0-1 中的處理器,就可以處理所有來自面板口1 的流量,又由于硬件架構原因,優化后的系統需要使用NUMA 6-7 中的處理器,來處理所有來自面板口2 的流量。所以優化后的系統只需要NUMA 0-1、6-7 的64 個處理器線程,就可以處理最大可接入的200G流量了,而優化前的系統和suricata 還需要繼續使用其他線程。(1)64 字節流量。優化后的最大處理能力比suricata 系統高出1 倍,比優化前的系統高出1.85 倍。(2)512 字節流量。優化后的最大處理能力比suricata 系統高出1.68 倍,比優化前的系統高出7.9 倍。(3)混合字節流量。優化后的最大處理能力比suricata 系統高出1.67 倍、比優化前的系統高出11.5 倍。
由4 組不同長度報文的對比圖可以看出,優化后的系統無論是在單核處理能力方面,還是在性能擴展性方面,都比優化前的系統和suricata 系統要好很多,并且系統最大處理能力要遠遠高于后兩種NTA 系統。由此可以證明,優化后的系統整體處理性能有了很大提升。
本研究提出的優化方法從硬件和軟件兩個方面對NTA 系統做優化,設計了一套基于DPDK 的可擴展收包框架,可以在硬件資源上按照NTA 系統的業務特性,將資源做合理劃分,解決硬件層面的資源競爭問題。提出了一種基于硬件的資源分區競爭消除方法,雖然不能完全解決沖突問題,但是已將沖突范圍大大減少,且不會消耗大量緩存資源、不影響系統擴展性。通過硬件、軟件兩方面的優化,可以使NTA 系統隨著資源的增加,處理能力達到近似線性增長的效果。基于該方法,在一款海光國產化平臺上,對NTA 進行性能優化,實驗結果表明,本研究設計的NTA 系統的實際性能擴展性與理論上的效果相符,可達到線性增長的效果。目前優化后的NTA 已經應用于CENI 網管的NTA 探針子系統上,后續會逐步將該方法推廣到網絡安全領域的其他設備上。