本文分為兩個部分:
- DOCA及BlueField介紹
- 如何運行DOCA應用,這里以DNS_Filter為例子做大致介紹。
DOCA及BlueField介紹:
現代企業數據中心是軟件定義的、完全可編程的基礎設施,旨在服務于跨云、核心和邊緣環境的高度分布式應用工作負載。盡管軟件定義的數據中心提供了類似云的靈活性和敏捷性,但它們往往會消耗大量的CPU資源,進而降低服務器和數據中心的整體效率。通過利用DPU(Data Processing Uint)和DOCA(Data Center Infrastructure on a Chip Architecture),可以實現硬件加速的軟件定義基礎設施,從而顯著提升數據中心的性能和靈活性。
DPU被定義為一種可編程的網絡系統級芯片(SoC),它集成了從網絡端口到PCI Express(PCIe)接口的所有主要功能。NVIDIA于2020年進入DPU市場,并推出了BlueField系列產品。已發布的BlueField-2能夠作為智能網卡和存儲控制器使用,支持高達200Gbps的以太網端口和高帶寬的PCIe接口。BlueField-3于2022年上市,而更強大的BlueField-4預計將在2024年推出。????
圖1
不同于傳統的服務器處理器,DPU(Data Processing Uint)專為網絡數據包處理而設計。盡管其架構有所不同,但大多數DPU都包含一個可編程的數據平面,以及用于控制平面和應用代碼的CPU核心。與使用CPU核心相比,DPU的專用數據路徑不僅更高效,而且性能顯著提升。
如圖所示,BlueField架構本質上將網卡子系統(基于ConnectX)與可編程數據路徑、用于加密、壓縮和正則表達式的硬件加速器,以及用于控制平面的Arm控制器融為一體。在BlueField-3中,包含16個核心的可編程包處理器能夠處理多達256個線程,實現了在Arm核心上零負載的數據路徑處理。在許多應用中,數據路徑可以自主處理已知的網絡流量,而Arm核心則負責處理新流量等異常情況及控制平面功能。
圖2
盡管DPU具備顯著的優勢,但由于需要用戶編寫底層代碼,其早期應用僅限于少數用戶群體。為了解決這一限制,并推動獨立軟件供應商(ISV)、服務提供商和學術界更廣泛地采用DPU,NVIDIA開發了DOCA(Data Center On A Chip Architecture)。
DOCA是一個由庫文件、運行時組件和服務組成的框架,構建在一套經過驗證的驅動程序之上。其中一些庫與開源項目相關,而另一些則是NVIDIA獨有的。正如CUDA為GPU編程提供了抽象化一樣,DOCA為DPU編程提供了更高級別的抽象化。
圖3
如上圖所示,DOCA軟件棧包括驅動程序、庫、服務代理和參考應用。NVIDIA 提供的軟件棧包含兩部分內容,一部分是面向開發者的 DOCA SDK,另一部分是用于實現開箱即用部署的 DOCA Runtime 軟件。
從軟件棧上層看,流量網關庫能夠實現一個建立在數據路徑 SFT 上的硬件加速網關,為過濾和分發網絡流量的網關應用提供了更高級別的抽象化。在存儲方面,DOCA 支持用戶態庫開源 SPDK。在 HPC 和 AI 方面,DOCA 初期加入了作為運行時組件的統一集合通信(UCC)庫,在未來版本中還將加入 SDK 支持。
DOCA應用體驗:
DNS過濾應用程序被設計為在BlueField-2 DPU實例上運行。DPU攔截來自網絡的流量(入站流量),并根據流量分類來決定是將其傳遞給Arm處理器(根據列表類型過濾接收到的數據包),還是通過發夾轉發到出口端口,整個系統設計如圖4所示。
圖4
DNS過濾器運行在DOCA Flow之上,用于對DNS請求進行分類。然后,它利用硬件正則表達式引擎,根據域名列表規則(編譯后的正則表達式)查找匹配項。
圖5
以下是DNS過濾應用程序的工作流程:
- 用戶將正則表達式列表規則文件編譯成
rof2.binary
文件。 - 正則表達式二進制規則文件被加載到正則表達式引擎中。
- 通過管道識別入站數據包類型,這些管道封裝了流規則匹配模式和動作。
- DNS過濾應用程序為每個端口構建三個管道:DNS丟棄管道、DNS轉發管道和發夾管道。除了丟棄管道外,每個管道只包含一個條目。丟棄管道在運行時包含許多條目,每個條目代表一個被丟棄的數據包。在應用程序初始化和配置之后,接受任何流量之前,管道是空的。
- 丟棄管道匹配已經被阻止的DNS數據包以丟棄它們。發夾管道匹配每個數據包(無遺漏)。丟棄管道作為根管道,DNS轉發管道作為丟棄管道的轉發未命中組件,發夾管道作為DNS轉發管道的轉發未命中組件。
操作流程:
1.解析應用程序參數。
doca_argp_init();
a).初始化arg解析器資源。
b).注冊DOCA通用旗幟。
Register_dns_filter_params();
c).注冊DNS過濾器應用程序標志。
doca_argp_start();
d).解析DPDK標志并調用rte_eal_init()函數。
e)解析應用程序標記。
2.DPDK初始化。
dpdk_init();
a).初始化DPDK端口,包括mempool分配。
b).如果需要,可以初始化發夾隊列。
c).將每個端口的發夾隊列綁定到其對等端口。
3.DNS過濾器初始化。
dns_filter_init();
a).DOCA流量和DOCA流量端口初始化。
b).為兩個端口創建發夾管道。該管道包括一個與每種類型的數據包匹配的條目(無遺漏), 并通過發夾將其轉發到出口端口。
c).為兩個端口創建DNS轉發管道。構建的管道有一個條目用于匹配DNS流量并將其?? 轉發到Arm。此外,如果DNS條目不匹配(例如,對于每個非DNS包,包將被轉發), 則使用hairpin管道進行轉發。
d).創建掉包管道,作為兩個端口的根管道。開始時,管道是空的。但隨著應用程序的 運行,它會添加掉包的條目。此外,DNS轉發管道用于轉發,如果掉包管道條目不匹 配。
e).DOCA RegEx初始化。
f).用已編譯的規則文件配置RegEx。
4.處理和過濾DNS包。
dns_worker_lcores_run()
a).Arm上接收到的所有數據包都是DNS數據包,而非DNS數??? 據包則通過使用允許? 過濾DNS數據包的發夾轉發到出口端口。
b).提取您所查詢的DNS。
c).將DNS查詢作為作業發送到RegEx引擎:
d).根據RegEx響應篩選DNS包。
e).如果需要,可通過向DNS刪除管道添加條目來阻止數據包。
5.DNS過濾器被銷毀。
dns filter destroy();
a).釋放所有分配的資源。
b).釋放提供所有DOCA RegEx資源。
6.Arg解析器銷毀。
doca_argp_destroy()
a).釋放DPDK資源。
具體步驟:DNS過濾器示例二進制文件位置/opt/mellanox/doca/applications/ dns_filter/bin/doca_dns_filter,
構建所有應用程序:
打開終端并導航到應用程序目錄:
cd /opt/mellanox/doca/applications/
使用Meson構建系統進行配置:
meson build
使用Ninja構建所有應用程序:
ninja -C build
如果僅構建DNS過濾器應用程序:
編輯構建選項:/opt/mellanox/doca/applications/meson_option.txt。
將 enable_all_applications 設置為 false。
將 enable_dns_filter 設置為 true。
運行與步驟2相同的命令來配置和構建:
meson build
ninja -C build
注意:
構建成功后,doca_dns_filter二進制文件將創建在./build/dns_filter/src/目錄下。
應用實例:
這里使用文本文件指定列表來添加url,并創建簽名數據庫將其添加到dpi引擎,使用dpdk庫中的狀態表模塊可以識別分類入口數據流量。
圖6
圖7
現在讓我們將此數據包從對端服務器發送到 DPU
圖8
我們可以看到,DPU 已將數據包識別為匹配簽名ID 1
圖9
當嘗試訪問被阻止的 URL時,將會被識別和過濾流量,隨后的數據包將被丟棄。主機完全不知道該過程并于此過程隔離。
圖10
總結一下DNS過濾器應用程序的包處理流程:
- 每個接收到的數據包首先與丟棄管道進行匹配檢查。如果匹配成功,則數據包被丟棄。
- 如果在丟棄管道中沒有匹配(未命中),則數據包會被檢查與DNS轉發管道進行匹配。如果在DNS轉發管道中匹配成功,數據包將被轉發到處理器。
- 如果在DNS轉發管道中仍然沒有匹配(再次未命中),數據包將被轉發到發夾管道進行匹配處理。
這種處理流程確保了數據包根據預定義的規則進行分類和處理,優化了DNS流量的管理和安全性。