儲(chǔ)蘇紅,劉 磊
(1.中國科學(xué)院聲學(xué)研究所國家網(wǎng)絡(luò)新媒體工程技術(shù)研究中心,北京 100190;2.中國科學(xué)院大學(xué),北京 100049)
信息技術(shù)的快速發(fā)展推進(jìn)了網(wǎng)絡(luò)服務(wù)的廣泛普及,越來越多的網(wǎng)絡(luò)設(shè)備和應(yīng)用程序造成流量爆發(fā)式增長,日益復(fù)雜的網(wǎng)絡(luò)環(huán)境中存在著巨大的安全隱患。傳統(tǒng)的安全設(shè)備如防火墻、漏洞掃描設(shè)備、網(wǎng)絡(luò)監(jiān)控程序等很難有效防范新型安全威脅[1]。網(wǎng)絡(luò)回溯分析系統(tǒng)通過捕獲留存網(wǎng)絡(luò)流量可精準(zhǔn)定位攻擊的發(fā)生點(diǎn),對(duì)網(wǎng)絡(luò)威脅進(jìn)行全方位、深層次、可反復(fù)回溯的檢測(cè)分析[2-3],從而更容易檢測(cè)出潛在的攻擊行為。
在高速網(wǎng)絡(luò)下實(shí)現(xiàn)高性能網(wǎng)絡(luò)流量捕獲是網(wǎng)絡(luò)回溯分析系統(tǒng)的基本功能。針對(duì)已有的基于DPDK的網(wǎng)絡(luò)回溯分析系統(tǒng),已經(jīng)實(shí)現(xiàn)了較高性能的數(shù)據(jù)包捕獲功能,然而在實(shí)際使用中經(jīng)常遇到DPDK 不支持原生網(wǎng)卡的問題,需要替換成支持DPDK 的網(wǎng)卡或者加載DPDK 專用驅(qū)動(dòng)程序才能使用。為了解決上述問題,需要研究新的高性能數(shù)據(jù)包捕獲技術(shù)應(yīng)用于網(wǎng)絡(luò)回溯分析系統(tǒng),使其能夠達(dá)到現(xiàn)有的性能指標(biāo)并解決硬件依賴性問題。
該文對(duì)XDP 的原理和數(shù)據(jù)包處理機(jī)制進(jìn)行了深入分析和研究,實(shí)現(xiàn)了基于Linux 平臺(tái)的數(shù)據(jù)包采集功能。利用Spirent 網(wǎng)絡(luò)測(cè)試儀和DELL 服務(wù)器分別對(duì)基于XDP 和DPDK 的網(wǎng)絡(luò)流量采集性能進(jìn)行測(cè)試。實(shí)驗(yàn)結(jié)果表明,XDP 在多隊(duì)列下與DPDK性能相似,并能與現(xiàn)有內(nèi)核網(wǎng)絡(luò)協(xié)議棧更好地配合。相比于DPDK,XDP 具有獨(dú)立于硬件設(shè)備,支持任何帶有Linux 驅(qū)動(dòng)程序的網(wǎng)卡,無需滿足特定網(wǎng)卡供應(yīng)商的要求。
傳統(tǒng)Linux 架構(gòu)下,網(wǎng)卡隊(duì)列接收到數(shù)據(jù)包后產(chǎn)生硬件中斷,從而觸發(fā)CPU 中斷,應(yīng)用程序處理網(wǎng)絡(luò)報(bào)文,整個(gè)過程中不斷地進(jìn)行中斷處理、上下文切換,帶來巨大的CPU 開銷,嚴(yán)重降低了網(wǎng)絡(luò)應(yīng)用程序的性能[4]。為了實(shí)現(xiàn)在高速網(wǎng)絡(luò)下能夠捕獲數(shù)據(jù)包,目前研究人員已經(jīng)設(shè)計(jì)出一些高性能數(shù)據(jù)包捕獲架構(gòu)。
Libpcap(Library of Packet Capture)是由伯克利實(shí)驗(yàn)室開發(fā)的可用于Unix、類Unix(Linux、BSD 等)和Windows 等多種操作系統(tǒng)的開源C/C++函數(shù)庫,現(xiàn)已成為網(wǎng)絡(luò)數(shù)據(jù)包捕獲的標(biāo)準(zhǔn)接口[5],很多常用的數(shù)據(jù)包捕獲應(yīng)用程序如Wireshark、Tcpdump、Snort 等都是基于Libpcap 實(shí)現(xiàn)的。
Libpcap 捕獲數(shù)據(jù)包流程:在網(wǎng)卡為混雜模式下,Libpcap 首先復(fù)制數(shù)據(jù)包進(jìn)行前置處理。然后將復(fù)制的數(shù)據(jù)包傳送到BPF(Berkeley Packet Filter)過濾器,根據(jù)設(shè)置的規(guī)則對(duì)流量進(jìn)行篩選,只將用戶所需要的數(shù)據(jù)包繼續(xù)傳輸?shù)絻?nèi)核緩沖區(qū),從而有效減少對(duì)無效數(shù)據(jù)包的處理開銷。最后,應(yīng)用程序通過系統(tǒng)調(diào)用讀取內(nèi)核緩沖區(qū)的數(shù)據(jù)包,以進(jìn)行后續(xù)處理。
如上所述,Libpcap 從網(wǎng)卡捕獲數(shù)據(jù)包傳送到用戶空間過程中同樣需要經(jīng)過內(nèi)核協(xié)議棧進(jìn)行處理,與傳統(tǒng)Linux 構(gòu)架下的數(shù)據(jù)包捕獲方式類似。同樣存在需要多次拷貝數(shù)據(jù)包和頻繁進(jìn)行上下文切換的問題,其性能并沒有得到太多優(yōu)化。
PF_RING 是由Luca Deri 為優(yōu)化流量捕獲過程中存在的多次數(shù)據(jù)拷貝和頻繁觸發(fā)硬件中斷等問題而研發(fā)的高速數(shù)據(jù)包捕獲庫。PF_RING 通過共享內(nèi)存避免數(shù)據(jù)包從內(nèi)核空間到用戶空間的拷貝,并結(jié)合設(shè)備輪詢(NAPI)技術(shù),減少了CPU 中斷次數(shù),極大地提高了數(shù)據(jù)包傳輸速率[6]。
PR_RING實(shí)現(xiàn)機(jī)制:首先在內(nèi)核中添加PF_RING協(xié)議簇和具有環(huán)形緩沖區(qū)的socket,提供兩個(gè)標(biāo)準(zhǔn)接口供網(wǎng)卡向緩沖區(qū)寫入數(shù)據(jù)包和應(yīng)用程序,并從中讀取數(shù)據(jù)包;網(wǎng)卡接收到數(shù)據(jù)包后,PF_RING 將數(shù)據(jù)包拷貝到環(huán)形緩沖區(qū),由于這塊環(huán)形緩沖區(qū)內(nèi)存由內(nèi)核和用戶空間共享,應(yīng)用程序就可直接讀取數(shù)據(jù)包,簡化了拷貝過程[7]。但是通過PF_RING 的數(shù)據(jù)包捕獲過程中并沒有實(shí)現(xiàn)零拷貝。另外,在一個(gè)時(shí)間點(diǎn)只有一個(gè)應(yīng)用能夠分發(fā)數(shù)據(jù)包,無法滿足多隊(duì)列的實(shí)現(xiàn)需求。
Netmap 是由Luigi Rizzo 等人基于零復(fù)制技術(shù)開發(fā)實(shí)現(xiàn)的高性能I/O 框架,不需要依賴特定硬件或修改應(yīng)用程序就能以較高性能實(shí)現(xiàn)用戶應(yīng)用與網(wǎng)卡間的數(shù)據(jù)包傳遞,在900 MHz 單核CPU 下就能實(shí)現(xiàn)10 G 網(wǎng)卡下線速數(shù)據(jù)包轉(zhuǎn)發(fā)[8]。
在共享內(nèi)存中,Netmap 使用兩對(duì)環(huán)形隊(duì)列進(jìn)行數(shù)據(jù)傳輸。網(wǎng)卡接收到數(shù)據(jù)包之后直接將其放入Netmap 環(huán)形隊(duì)列,應(yīng)用程序檢測(cè)到已有數(shù)據(jù)包傳入就通過調(diào)用Netmap API 直接獲取環(huán)形隊(duì)列里的數(shù)據(jù),這個(gè)過程實(shí)現(xiàn)了零拷貝從而能有效提高數(shù)據(jù)傳輸性能[9]。另外,Netmap 也有較好的安全性保證。雖然使用共享內(nèi)存方式實(shí)現(xiàn)了數(shù)據(jù)傳輸,但是內(nèi)核和網(wǎng)卡寄存器的關(guān)鍵內(nèi)存區(qū)域沒有暴露給應(yīng)用程序,因此不會(huì)因?yàn)檫\(yùn)行應(yīng)用程序而導(dǎo)致內(nèi)核崩潰。然而Netmap 只能使用中斷通知機(jī)制,并沒有完全解決性能瓶頸。
DPDK 是Intel 公司開發(fā)的用于多核CPU 的數(shù)據(jù)包處理套件,可提供豐富的數(shù)據(jù)包快速處理開發(fā)函數(shù)庫和網(wǎng)卡驅(qū)動(dòng)庫,已成為目前主流的高性能網(wǎng)絡(luò)報(bào)文處理架構(gòu)[10]。DPDK 使用內(nèi)核旁路技術(shù)、用戶空間程序完全控制網(wǎng)絡(luò)硬件,大大減少了由于上下文切換、中斷等事件引起的內(nèi)核開銷,具有較高的數(shù)據(jù)包捕獲效率。
DPDK 架構(gòu)圖如圖1 所示。
圖1 DPDK架構(gòu)圖
緩沖區(qū)管理:負(fù)責(zé)創(chuàng)建、釋放報(bào)文緩存;
內(nèi)存池管理:負(fù)責(zé)分配管理內(nèi)存中的對(duì)象池,能夠快速分配、釋放緩沖區(qū);
環(huán)管理:采用生產(chǎn)者消費(fèi)者模式的無鎖環(huán)形隊(duì)列進(jìn)行資源的分配與釋放,也能實(shí)現(xiàn)核間或處理單元間的通信;
輪詢驅(qū)動(dòng)模塊:實(shí)現(xiàn)在輪詢方式下進(jìn)行網(wǎng)絡(luò)報(bào)文收發(fā),通過UIO(Userspace I/O)驅(qū)動(dòng)技術(shù)攔截中斷,避免因中斷產(chǎn)生的響應(yīng)時(shí)延,極大提高了網(wǎng)卡收發(fā)性能;
環(huán)境抽象層:提供一個(gè)通用接口獲得對(duì)底層資源的訪問,主要負(fù)責(zé)系統(tǒng)初始化、PCI 設(shè)備初始化、內(nèi)存資源以及驅(qū)動(dòng)程序初始化工作[11]。
DPDK 支持run-to-complete 報(bào)文處理模型,應(yīng)用程序執(zhí)行之前需先分配好所有的資源,并作為執(zhí)行單元運(yùn)行在邏輯核上。數(shù)據(jù)面處理程序執(zhí)行時(shí),結(jié)合自身需求調(diào)用相應(yīng)的DPDK API,然后運(yùn)行網(wǎng)卡驅(qū)動(dòng)程序,將數(shù)據(jù)包直接轉(zhuǎn)發(fā)到用戶空間,這個(gè)過程中實(shí)現(xiàn)了內(nèi)核旁路。應(yīng)用程序通過輪詢報(bào)文到達(dá)標(biāo)志位,監(jiān)測(cè)是否有新的報(bào)文需要處理,通過輪詢的方式極大地提高了報(bào)文處理能力。另外,DPDK 可以通過HUGEPAGE 和CPU Affinity 機(jī)制來提高網(wǎng)絡(luò)流量的處理性能。
DPDK 在提供了極高的數(shù)據(jù)包處理性能的同時(shí),也存在一定的缺陷。其采用的內(nèi)核旁路技術(shù)完全繞開操作系統(tǒng),因此操作系統(tǒng)提供的較為成熟的配置、部署和管理工具都將停止運(yùn)行,應(yīng)用程序隔離和安全機(jī)制也將被繞開,帶來了重大的管理、維護(hù)和完全缺陷。另外,在實(shí)際使用中,網(wǎng)卡需要加載專門的DPDK 驅(qū)動(dòng)程序才能與硬件交互,目前DPDK 只支持部分網(wǎng)卡,并非所有的網(wǎng)卡都能使用DPDK 實(shí)現(xiàn)數(shù)據(jù)包捕獲。
XDP 驅(qū)動(dòng)掛鉤:位于網(wǎng)卡驅(qū)動(dòng)程序中,是XDP 程序的主要入口點(diǎn),在網(wǎng)卡接收到數(shù)據(jù)包時(shí)執(zhí)行;
eBPF(extended BPF)虛擬機(jī):eBPF 程序的執(zhí)行環(huán)境,編譯并執(zhí)行XDP 程序的字節(jié)碼;
BPF 映射:鍵/值存儲(chǔ)方式,用于與系統(tǒng)其余部分進(jìn)行通信;
BPF 程序校驗(yàn)器:加載程序之前對(duì)其進(jìn)行安全檢查,判斷其是否符合規(guī)范,確保程序能安全執(zhí)行不會(huì)引發(fā)內(nèi)核崩潰等安全問題。
XDP 處于網(wǎng)絡(luò)驅(qū)動(dòng)程序內(nèi)部的RX 路徑上,如圖2 所示,當(dāng)網(wǎng)卡收到數(shù)據(jù)包時(shí),甚至在內(nèi)核為數(shù)據(jù)包分配sk_buff 和解析數(shù)據(jù)包之前,XDP 程序就可對(duì)數(shù)據(jù)包進(jìn)行處理[13]。用戶空間將數(shù)據(jù)包處理規(guī)則寫入BPF 映射中,XDP 程序讀取執(zhí)行判決,對(duì)數(shù)據(jù)包進(jìn)行相應(yīng)的操作,如直接丟棄數(shù)據(jù)包(XDP_DROP),將數(shù)據(jù)包從接收端口轉(zhuǎn)發(fā)(XDP_TX),通過零拷貝套接字AF_XDP[14-15]將它們重定向到另一個(gè)接口或用戶空間(XDP_REDIRECT),或者允許數(shù)據(jù)包進(jìn)入網(wǎng)絡(luò)堆棧進(jìn)行進(jìn)一步處理(XDP_PASS)。
圖2 XDP架構(gòu)圖[13]
為了提高數(shù)據(jù)包捕獲能力,可采用Linux 4.18中新引入的套接字AF_XDP,以零拷貝的方式將數(shù)據(jù)包直接從內(nèi)核空間重定向到用戶空間。如圖3所示,每個(gè)AF_XDP 套接字涉及兩個(gè)隊(duì)列:RX_RING和TX_RING。RX_RING 位于AF_XDP 套接字接收端,用于接收數(shù)據(jù)包;TX_RING 位于AF_XDP 發(fā)送端,用于發(fā)送數(shù)據(jù)包。數(shù)據(jù)包存儲(chǔ)區(qū)域UMEM 也有兩個(gè)隊(duì)列:FILL_RING 和COMPLETION_RING。在接收數(shù)據(jù)包過程中,應(yīng)用程序首先在FILL_RING 中填充接收數(shù)據(jù)包的地址,通知內(nèi)核該區(qū)域用以存儲(chǔ)數(shù)據(jù)包;XDP 程序?qū)⒔邮盏降臄?shù)據(jù)包放入該地址后,內(nèi)核在RX_RING 中填入對(duì)應(yīng)的文件描述符;應(yīng)用程序通過檢查RX_RING 就能判斷是否接收到了數(shù)據(jù)包。在發(fā)送數(shù)據(jù)包過程中,應(yīng)用程序在TX_RING 中填充指向要發(fā)送的數(shù)據(jù)包的文件描述符,通知內(nèi)核該數(shù)據(jù)包需要被發(fā)送。數(shù)據(jù)包發(fā)送結(jié)束后,內(nèi)核在COMPLETION_RING 中填入已發(fā)送數(shù)據(jù)包的地址。
圖3 AF_XDP UMEM和RING結(jié)構(gòu)圖
XDP 程序可以通過圖4 所示的三種模式附加到網(wǎng)絡(luò)接口上。若可編程網(wǎng)卡硬件支持,則XDP 程序可使用Offloaded XDP 模式直接掛載在可編程網(wǎng)卡上,不需使用主機(jī)CPU,以極低的成本直接在網(wǎng)卡上處理數(shù)據(jù)包;若網(wǎng)卡驅(qū)動(dòng)程序支持,則XDP 程序可使用Native XDP 模式運(yùn)行在網(wǎng)絡(luò)驅(qū)動(dòng)的早期接收路徑;對(duì)于網(wǎng)卡和驅(qū)動(dòng)程序都不支持XDP 的環(huán)境,XDP程序可使用Generic XDP 模式運(yùn)行在網(wǎng)絡(luò)協(xié)議棧中,將XDP 程序作為常規(guī)網(wǎng)絡(luò)路徑的一部分加載到內(nèi)核中,不需要對(duì)硬件和驅(qū)動(dòng)程序進(jìn)行修改[16]。
王國維:“其(羅)說是也,始以地名為國號(hào),繼以為有天下之號(hào),其后確不常厥居,而王都所在,仍稱天邑商,訖于失天下而不改?!摇吨軙ざ嗍俊吩疲骸劣韪仪鬆栍谔煲厣??!堑坌?、武庚之居,猶稱商也?!?/p>
圖4 XDP程序附加位置示意圖
網(wǎng)絡(luò)回溯分析系統(tǒng)是為了應(yīng)對(duì)日益嚴(yán)峻的網(wǎng)絡(luò)安全形勢(shì)而設(shè)計(jì)的能夠?qū)?shù)據(jù)包進(jìn)行采集留存和分析檢索的系統(tǒng)。通過采集存儲(chǔ)網(wǎng)絡(luò)鏈路流量,可對(duì)網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行深度檢測(cè)和回溯分析,是對(duì)網(wǎng)絡(luò)進(jìn)行監(jiān)控和管理的有效手段。網(wǎng)絡(luò)回溯分析系統(tǒng)結(jié)構(gòu)如圖5 所示,主要由流量采集、流量分析、流量存儲(chǔ)和流量展現(xiàn)四個(gè)模塊組成。
圖5 網(wǎng)絡(luò)回溯分析系統(tǒng)結(jié)構(gòu)圖
流量采集模塊:是整個(gè)網(wǎng)絡(luò)回溯分析系統(tǒng)的基礎(chǔ),負(fù)責(zé)捕獲傳入網(wǎng)卡的流量。
流量分析模塊:對(duì)采集的流量進(jìn)行分析,確定當(dāng)前流量是否存在威脅;
流量存儲(chǔ)模塊:負(fù)責(zé)存儲(chǔ)網(wǎng)絡(luò)數(shù)據(jù)包,以供后續(xù)取證分析;
流量展現(xiàn)模塊:展現(xiàn)數(shù)據(jù)采集和分析的結(jié)果,并能根據(jù)用戶需求展現(xiàn)回溯分析結(jié)果。
以上四個(gè)模塊相輔相成共同組成網(wǎng)絡(luò)回溯分析系統(tǒng),該文的研究內(nèi)容主要針對(duì)流量采集模塊,基于XDP 技術(shù)實(shí)現(xiàn)高速網(wǎng)絡(luò)下的流量采集,主要包括以下幾個(gè)步驟[17-18]:
1)創(chuàng)建AF_XDP 套接字:通過socket()系統(tǒng)調(diào)用創(chuàng)建AF_XDP 套接字,并生成指向數(shù)據(jù)包存儲(chǔ)區(qū)的文件描述符;
2)映射隊(duì)列:將與AF_XDP 套接字和UMEM 相關(guān) 的RX_RING、TX_RING、FILL_RING 和COMPLE TION_RING 通過_RING setsockopt()系統(tǒng)調(diào)用進(jìn)行配置和創(chuàng)建,使用mmap()進(jìn)行映射;
3)綁定AF_XDP 套接字到接口:在傳輸流量之前必須使用bind()調(diào)用將AF_XDP 套接字綁定到一個(gè)設(shè)備和該設(shè)備指定的隊(duì)列上;
4)轉(zhuǎn)發(fā)數(shù)據(jù)包到XDP 套接字:首先創(chuàng)建BPF 映射來關(guān)聯(lián)隊(duì)列和AF_XDP 套接字,然后匯編BPF 程序,最后將BPF 程序附加到目標(biāo)接口。應(yīng)用程序通過bpf()系統(tǒng)調(diào)用將AF_XDP 套接字放到BPF 進(jìn)行映射,XDP 程序根據(jù)映射索引將報(bào)文重定向到該套接字。在該過程中會(huì)校驗(yàn)套接字是否確實(shí)綁定到該設(shè)備和指定隊(duì)列上,如果沒有成功綁定設(shè)備則會(huì)丟棄報(bào)文;
5)接收數(shù)據(jù)包:通過FILL_RING 和RX_RING 轉(zhuǎn)移指向內(nèi)存緩沖區(qū)地址的文件描述符來實(shí)現(xiàn)數(shù)據(jù)包的接收;
6)停止數(shù)據(jù)包傳輸:在XDP 程序執(zhí)行到最后需要停止數(shù)據(jù)包傳輸時(shí),使用close()系統(tǒng)調(diào)用停止數(shù)據(jù)流并釋放XDP 套接字,使用munmap()取消環(huán)形隊(duì)列的映射。
在該文范圍內(nèi)很難對(duì)所有高性能報(bào)文采集技術(shù)進(jìn)行實(shí)驗(yàn)測(cè)試,DPDK 是可獲得的現(xiàn)有的高性能的主流解決方案,并且現(xiàn)有網(wǎng)絡(luò)回溯分析系統(tǒng)基于DPDK 技術(shù)來實(shí)現(xiàn),因此該文重點(diǎn)通過實(shí)驗(yàn)對(duì)比XDP 和DPDK 對(duì)原始數(shù)據(jù)包的接收性能。
實(shí)驗(yàn)環(huán)境由Spirent 網(wǎng)絡(luò)測(cè)試儀SPT-C50 和Dell PowerEdge R740xd 服務(wù)器構(gòu)成,以Spirent 網(wǎng)絡(luò)測(cè)試儀作為流量產(chǎn)生器,服務(wù)器作為被測(cè)設(shè)備。服務(wù)器使用Intel(R) Xeon(R) Silver 4216 CPU @ 2.10 GHz 處理器,內(nèi)存大小為128 GB,操作系統(tǒng)版本為CentOS Linux release 8.3.2011,系統(tǒng)內(nèi)核為4.18.0-193.el8.x86_64。被測(cè)設(shè)備的網(wǎng)卡端口直接連接到流量產(chǎn)生器端口,在被測(cè)儀器端分別執(zhí)行XDP 和DPDK 程序,統(tǒng)計(jì)零丟包下的流量吞吐率。該實(shí)驗(yàn)分別使用1、2、4、8 個(gè)接收隊(duì)列對(duì)Intel X710、Intel X520、NetXtreme II BCM57810 和ConnectX-3Pro 等10 G 網(wǎng)卡進(jìn)行不同數(shù)據(jù)包大小下的收包性能測(cè)試。
圖6 為XDP 和DPDK 在Intel X710 網(wǎng)卡下的測(cè)試結(jié)果,由圖6 可明顯看出XDP 在一個(gè)隊(duì)列下收包速率最多只能達(dá)到5.89 Mpps,而DPDK 在一個(gè)隊(duì)列下就可以達(dá)到64 B幀大小下的線速為14.88 Mpps,在單隊(duì)列下DPDK 的性能明顯高于XDP。但增加隊(duì)列數(shù)可以提高XDP 的性能,基本上使用四個(gè)隊(duì)列就能夠達(dá)到DPDK 的性能。
圖6 Intel X710網(wǎng)卡測(cè)試結(jié)果
圖7 為XDP 和DPDK 在Intel X520 網(wǎng)卡下的測(cè)試結(jié)果,與Intel X710 網(wǎng)卡測(cè)試結(jié)果類似,單隊(duì)列下XDP 性能明顯低于DPDK,使用多隊(duì)列能提高XDP收包性能。不過在Intel X520 網(wǎng)卡下,XDP 使用四個(gè)隊(duì)列達(dá)到最高性能時(shí)仍沒有到達(dá)64 B 幀大小的線速,DPDK 使用單隊(duì)列就能夠達(dá)到,說明XDP 性能略低于DPDK。
圖7 Intel X520網(wǎng)卡測(cè)試結(jié)果
圖8 為XDP 和DPDK 在NetXtreme II BCM57810網(wǎng)卡下的測(cè)試結(jié)果,相比于Intel X710 和Intel X520網(wǎng) 卡,XDP 和DPDK 使 用NetXtreme II BCM57810 網(wǎng)卡的性能都顯著降低,說明XDP 和DPDK 的收包性能針對(duì)不同網(wǎng)卡具有一定的差異性。此時(shí)NetXtreme II BCM57810 網(wǎng)卡使用的驅(qū)動(dòng)程序bnx2x 不支持XDP,XDP 程序只能使用Generic XDP 模式運(yùn)行,數(shù)據(jù)包需要經(jīng)過內(nèi)核協(xié)議棧進(jìn)行處理,因此導(dǎo)致性能降低。
圖8 BCM57810網(wǎng)卡測(cè)試結(jié)果
圖9 為XDP 和DPDK 在ConnectX-3Pro 網(wǎng)卡下的測(cè)試結(jié)果,DPDK 不支持ConnectX-3Pro 網(wǎng)卡,故無法實(shí)現(xiàn)收包,XDP 可使用Generic XDP 模式不需修改硬件和原生驅(qū)動(dòng)程序就可以實(shí)現(xiàn)收包,在滿足零丟包條件下最多能達(dá)到線速為4.46 Mpps。
圖9 ConnectX-3Pro網(wǎng)卡測(cè)試結(jié)果
根據(jù)實(shí)驗(yàn)數(shù)據(jù)可分析出:
1)盡管在單隊(duì)列時(shí)XDP收包性能明顯低于DPDK,但通過增加隊(duì)列數(shù)來提高性能,在多隊(duì)列下XDP 與DPDK 收包性能相差不大;
2)XDP 和DPDK 的收包性能針對(duì)不同網(wǎng)卡具有一定的差異性;
3)對(duì)于DPDK 不支持的網(wǎng)卡硬件,XDP 也能完成收包功能,不需依賴專門的網(wǎng)卡硬件。
該文針對(duì)XDP 技術(shù)原理、數(shù)據(jù)包處理流程進(jìn)行了詳細(xì)的分析和研究。XDP 將高性能數(shù)據(jù)包處理與操作系統(tǒng)內(nèi)核進(jìn)行集成,通過提供安全的執(zhí)行環(huán)境并受到內(nèi)核社區(qū)的支持,顯著降低了應(yīng)用程序處理數(shù)據(jù)包的成本。針對(duì)XDP 技術(shù)和網(wǎng)絡(luò)回溯分析系統(tǒng)目前正在使用的DPDK 技術(shù)進(jìn)行實(shí)驗(yàn)對(duì)比,分析得出,雖然XDP 在單隊(duì)列下數(shù)據(jù)包捕獲性能低于DPDK,但是在多隊(duì)列下XDP 能達(dá)到DPDK 的性能;另外XDP 有三種模式供用戶選擇,基本能適應(yīng)所有帶有Linux 驅(qū)動(dòng)程序的網(wǎng)卡而不需修改原生驅(qū)動(dòng)程序,有效減少了對(duì)網(wǎng)卡的依賴性。將XDP 技術(shù)應(yīng)用于網(wǎng)絡(luò)回溯分析系統(tǒng)能夠在保證其性能的基礎(chǔ)下,增加系統(tǒng)的兼容性和安全性,具有重要意義。