數(shù)據(jù)中心轉(zhuǎn)型
芯片采購網(wǎng)專注于整合國內(nèi)外授權(quán)IC代理商現(xiàn)貨資源,芯片庫存實時查詢,行業(yè)價格合理,采購方便IC芯片,國內(nèi)專業(yè)芯片采購平臺。
NVIDIA BlueField DPU (數(shù)據(jù)處理器)可用于加速網(wǎng)絡(luò)功能。這種網(wǎng)絡(luò)卸載可以使用 DPDK ,也可以用 NVIDIA DOCA 軟件框架。
在本系列中,我構(gòu)建了一個應(yīng)用程序,并以兩種方式卸載:DPDK 和 NVIDIA DOCA SDK 。我將每個步驟記錄為單獨的代碼補丁,并在每個系列中提供完整的步驟。這部分將向您展示如何使用它 DPDK 編程 BlueField DPU 。
用例
首先,我需要一個簡單但有意義的用例 DPU 上部署應(yīng)用程序。我選擇了基于策略的路由( PBR )來根據(jù)第 3 層和第 4 層數(shù)據(jù)包屬性將流量引導(dǎo)到不同的網(wǎng)關(guān),覆蓋(或補充) X86 主機選擇的網(wǎng)關(guān)。現(xiàn)實世界中需要這樣做的原因有很多,包括以下示例:
· 將選定的主機流量發(fā)送到外部防火墻進(jìn)行額外審核
· 增強 Anycast 負(fù)載平衡服務(wù)器
· 應(yīng)用 QoS
圖 1 . 使用 PBR 將流量從主機引導(dǎo)到兩個網(wǎng)關(guān)之一
我在 DPU (BF2-ARM)上使用 PBR 流量來自主機( server1-x86 )引導(dǎo)兩個網(wǎng)關(guān) [leaf2, leaf3] 其中之一。葉交換機隨后將流量轉(zhuǎn)發(fā)給當(dāng)?shù)剡B接的選播服務(wù)提供商 [server2, server3] 。
構(gòu)建應(yīng)用程序
第一個問題:我是寫一個新的應(yīng)用程序,還是卸載一個現(xiàn)有的應(yīng)用程序?
我決定卸載我最喜歡的開源路由軟件棧 FRRouting ( FRR )的 PBR 功能。這使我能夠擴展現(xiàn)有的代碼庫和現(xiàn)有的代碼庫 sample apps 形成良好的對比。FRR 支持多種數(shù)據(jù)平面插件的框架可以輕松使用 DPDK 和 DOCA 實現(xiàn)新的數(shù)據(jù)平面插件并集成到 FRR 。
圖 2 . DPDK 和 DOCA 插件可以很容易地添加到 FRR中
DPU 應(yīng)用程序原型
本節(jié)將介紹創(chuàng)作 DPU 應(yīng)用程序需要準(zhǔn)備硬件加速功能。
DPU 硬件
我有一個 x86 服務(wù)器安裝在上面 BlueFied-2 DPU , 該 DPU 有兩個 25G 上行鏈路和一個帶 8GB 內(nèi)存的 ARM 處理器 。更多關(guān)于硬件安裝的信息,請參考 DOCA SDK 文檔 。也可使用 DPU PocKit 構(gòu)建和引導(dǎo)您的系統(tǒng)環(huán)境.
我安裝了 BlueField 啟動流文件( BFB ),它為 DPU 提供了 Ubuntu 操作系統(tǒng)圖像附帶 DOCA-1.2 和 DPDK-20.11.3 的庫。
圖 3 . Netdev Representors
使用 SR-IOV ,我在主機上為兩臺虛擬機創(chuàng)建了兩個虛擬函數(shù)( VF )接口。
主機上的 PF 和 VF 分別映射到 DPU ARM 上的以下 netdev representors 。
表 1 .主機上 PF 和 VF 的映射
使用 DPDK testpmd 原型設(shè)計應(yīng)用程序
首先,我用 DPDK 的 testpmd 我的用例原型化設(shè)計,位于 DPU 的 / opt / mellanox / 目錄下。
包括 testpmd 在內(nèi)的任何 DPDK 必須設(shè)置所有應(yīng)用程序 hugepages 。
(可選)保留配置,使其在 DPU 重啟后仍然有效。
啟動 testpmd 。
Testpmd 會消耗更多的內(nèi)存,默認(rèn)情況下會分配 3.5 GB 。因為我不需要在那里 CPU 處理數(shù)據(jù)流量時,我會 total-mem 的值設(shè)定為 200M ,其中 total-mem = total-num-mbufs * mbuf-size (默認(rèn) mbuf-size 為 2048 字節(jié))。我還使用了 flowMarvell代理-isolation 模式,因為我必須 ARP 數(shù)據(jù)包發(fā)送到 DPU 內(nèi)核網(wǎng)絡(luò)堆棧分析 PBR 下一跳)。初始化完成后,-i選項使得 testpmd 進(jìn)入交互式 shell 。
作為 testpmd 完成 rte_eal 初始化的一部分, mlx5_pci 被探測并成為可訪問的設(shè)備 DPDK 端口。
你在這里看到的 DPDK 端口對應(yīng) PF / VF representor 和兩個上行鏈路。
表 2 . DPDK 端口映射
流創(chuàng)建
接下來,通過定義 ingress port 、源 IP 、目標(biāo) IP 、我用協(xié)議和端口 rte_flow 下發(fā)了PBR規(guī)則。此外,我還定義了匹配數(shù)據(jù)包采用的方法 ACTION 。源 MAC 和目標(biāo) MAC 被重寫, TTL 出口端口設(shè)置為物理上行鏈路 p0 。
這條 PBR 規(guī)則從 VM1接收 DNS 并將其發(fā)送到特定的流量 GW ( leaf2, server2 )。我還故障定位,我還增加了一個計數(shù)器。
DPU 卸載可以工作 Switch ( FDB )模式,也可以工作 NIC 模式。在這個用例中,經(jīng)過幾次數(shù)據(jù)包修改,我需要將流量從 X86 主機重定向 25G 上行鏈路。所以在概念上,這里使用 Switch ( FDB ) 因此,需要設(shè)置模式 rte_flow 的 transfer 屬性。
流程驗證
我從 VM1 發(fā)送一些流量,看看它是否與我一起使用 testpmd 創(chuàng)建的 flow 通過執(zhí)行是否匹配 query 命令來查看。
結(jié)果是匹配的,在 leaf2/server2 這些流量和修改后的數(shù)據(jù)包頭可以在上面看到。因為操作流量是 DNS ,所以為了測試流量,我從 VM1 發(fā)送 DNS 請求。我使用它來控制流量速率和其他數(shù)據(jù)包字段 mz 生成測試流量。
另一種健全檢查是檢查此流是否真的卸載。這樣做有兩種方法:
· 在 Arm CPU 上使用 tcpdump 確保內(nèi)核不接收此類數(shù)據(jù)包。
· 檢查硬件 eSwitch 是否有相應(yīng)的流量規(guī)則。
mlx_steering_dump 允許您在硬件上查看成功的流量規(guī)則。 git 下載并安裝工具。
使用 mlx_steering_dump_parser.py 腳本驗證硬件中發(fā)布的流量規(guī)則。
此命令打印出來 testpmd 應(yīng)用程序發(fā)布的所有流程規(guī)則。硬件上設(shè)置的外部可以看到 頭部匹配信息和前面RTE_FLOW定義的匹配 [SIP = 172.20.0.8 , DIP = 172.30.0.8 , IP proto = UDP , UDP dport = 53] 是一致的。流量計數(shù)器的值作為打印輸出的一部分也被讀取和重置。
作為應(yīng)用程序設(shè)計思維過程的最后一步,原型設(shè)計已經(jīng)完成。現(xiàn)在我知道我可以了 DPDK 中建立一個 PBR 規(guī)則,將其安裝在硬件中,并修改我們感興趣的數(shù)據(jù)報告。現(xiàn)在在下一節(jié)添加 DPDK 數(shù)據(jù)平面。
構(gòu)建 DPDK 數(shù)據(jù)平面插件
在這一節(jié)中,我將通過方向 Zebra 添加一個 DPDK 介紹數(shù)據(jù)平面插件 DPU 對 PBR進(jìn)行 硬件加速步驟。我將這些步驟分解為單獨的代碼提交,整個補丁集 reference 提供形式。
圖 4 .路由基于策略 DPDK 卸載工作流
開發(fā)環(huán)境
因為目標(biāo)體系結(jié)構(gòu)是 DPU Arm ,所以可以直接在那里 DPU Arm上構(gòu)建、在 X86 CPU 交叉編譯或在云中構(gòu)建。在這篇文章中,我直接在那里 DPU Arm 編碼構(gòu)建。
以 root 用戶身份操作應(yīng)用程序
FRR 通常作為非 root 用戶運行。FRR 整個互聯(lián)網(wǎng)路由表可以下載和上傳;這可能有什么問題?然而,幾乎所有人 DPDK 應(yīng)用程序都是以 root 用戶身份操作, DPDK 庫和驅(qū)動程序也是基于此設(shè)計的。
經(jīng)過多次實驗并使用 root 重新編譯用戶選項 FRR, 我還是放不下 FRR 作為非 root 用戶工作。這是可以接受的,因為我在一個安全的空間,即 DPU Arm 中運行 FRR 。
向 Zebra 添加新插件
Zebra 是 FRR 其中一個守護過程負(fù)責(zé)整合路由協(xié)議守護過程的更新和構(gòu)建轉(zhuǎn)發(fā)。Zebra 還有一個基礎(chǔ)設(shè)施可以將這些轉(zhuǎn)發(fā)表送到圖像 Linux 內(nèi)核等數(shù)據(jù)平面。
將 DPDK 共享庫鏈接到 zebra
FRR 有自己的構(gòu)建系統(tǒng),限制直接導(dǎo)入外部 make 文件。由于 pkg-config 簡單優(yōu)雅,鏈接相關(guān)庫 Zebra 很容易。
我找到了 libdpdk.pc 并添加 PKG_CONFIG_PATH 值中:
FRR 有自己的構(gòu)建系統(tǒng),限制直接導(dǎo)入外部 make 文件。由于 pkg-config 簡單優(yōu)雅,鏈接相關(guān)庫 Zebra 很容易。
我找到了 libdpdk.pc 并添加 PKG_CONFIG_PATH 值中:
我在 FRR makefile (configure.ac)中為 DPDK 添加了 pkg check-and-define 宏。
我將 DPDK libs和cflags抽象包含在zebra-dp-dpdk make 宏( zebra/subdir.am )中。
有了這些,我就有了構(gòu)建插件所需的所有頭文件和庫。
初始化硬件
第一步是硬件的初始化。
這將探測 PCIe 設(shè)備并填充 DPDK rte_eth_dev 數(shù)據(jù)庫。
初始化端口
然后設(shè)置硬件端口。
端口映射設(shè)置應(yīng)用程序
FRR 有自己的基礎(chǔ) Linux netdevs 使用表的接口(端口)表 NetLink 更新填充并使用 ifIndex 索引鍵值。PBR 將規(guī)則錨定到表中的一個接口。要編程 PBR 數(shù)據(jù)平面條目需要一個 Linux ifIndex 和 DPDK port-id 值之間的映射表。netdev 信息已經(jīng)在 DPDK 可用于驅(qū)動程序 rte_eth_dev_info_get 查詢。
配置硬件端口
此外,所有端口都需要放置 flow-isolation 并啟動模式。
Flow-isolation 該模式將未命中的數(shù)據(jù)包發(fā)送到核心網(wǎng)絡(luò)堆棧,允許其處理 ARP 請求等等。
使用 rte _流 API 編程 PBR 規(guī)則
PBR 現(xiàn)在需要使用規(guī)則 rte_flow 以下是一個例子規(guī)則:
通過這些參數(shù) rte_flow_attributes 、 rte_flow_item ( match ) 和 rte_flow_action 填充數(shù)據(jù)結(jié)構(gòu)。
流屬性
該數(shù)據(jù)結(jié)構(gòu)用于指示 PBR 流量用于分組重定向或 transfer flow 。
流匹配項
DPDK 使用數(shù)據(jù)包頭中的每一層 {key, mask} 匹配結(jié)構(gòu):以太網(wǎng), IP 、 UDP 等。
填寫這些數(shù)據(jù)結(jié)構(gòu)需要大量的重復(fù)代碼。
流動作
DPDK 為每個 Action 使用單獨的數(shù)據(jù)結(jié)構(gòu),然后允許您以可變長度數(shù)組的形式提供所有流量規(guī)則 Actions 。有關(guān) Actions 如下:
驗證和創(chuàng)建流程
您可以驗證可選項 rte_flow_attr、rte_flow_item 和 rte_flow_action 列表。
驗證通常用于檢查底層 DPDK 驅(qū)動程序是否支持特定的流配置。在最終代碼中,您可以直接跳轉(zhuǎn)到流創(chuàng)建。
Rte_flow 命令錨定到輸入端口。可以創(chuàng)建多個流條目組并鏈接這些組。即使流條目沒有鏈的第一組,也就是不在組中 0 它仍然必須錨定到輸入端口。group-0 性能限制存在。
流量插入率為 group-0 受限制。繞過這個限制,你可以 group-0 安裝默認(rèn)流,跳轉(zhuǎn)到 group-1 ”,然后在 group-1 創(chuàng)建流量規(guī)則。
流刪除
流創(chuàng)建 API 返回流指針,必須緩存后續(xù)流刪除。
FRR-PBR 分析保護過程管理狀態(tài)機,添加或刪除 PBR 因此,我不必使用它。 DPDK 衰老的原始函數(shù) PBR 規(guī)則。
流量統(tǒng)計
在創(chuàng)建流量時,我將計數(shù)操作附加到流量中。可用于查詢流量統(tǒng)計信息和命中次數(shù)。
為了便于測試和驗證,我插入了統(tǒng)計顯示 FRR 的 vtysh CLI 。
測試應(yīng)用程序
我以 root 啟動了用戶身份 FRR ,并通過 /etc/frr/daemons 新添加的文件啟用 DPDK 插件:
DPDK-port 映射表的 FRR 接口已填充:
接下來,我會 PBR 來自匹配的規(guī)則配置 VM1 的 DNS 并使用流量 frr.conf 重定向 leaf2 。
我從 VM1 發(fā)送 DNS 查詢到 anycast DNS 服務(wù)器。
匹配流量,并使用修改后的數(shù)據(jù)包頭將流量轉(zhuǎn)發(fā)到目的地 leaf2/server2 。這可以連接到流的計數(shù)器并使用 mlx_steering_dump 驗證硬件轉(zhuǎn)儲。
FRR 現(xiàn)在功能齊全了 DPDK 可用于數(shù)據(jù)平面插件 DPU 硬件上卸載 PBR 規(guī)則。
總結(jié)
本文回顧了使用情況 DPDK RTE_FLOW庫在 BlueField 上硬件加速 PBR 規(guī)則的 FRR 創(chuàng)建數(shù)據(jù)平面插件。在下一篇文章中,我將帶您了解 FRR DOCA 數(shù)據(jù)平面插件,并向您展示如何使用新的 DOCA_FLOW 庫卸載 PBR 規(guī)則。
- 宏碁搶進(jìn)元宇宙 打造新NFT平臺
- 爆料:雖然還是 A15 芯片,蘋果 iPhone 14/Max 性能還是會提高的
- 林志穎特斯拉發(fā)生車禍?是自動駕駛嗎?Autopilot問題?自動駕駛不應(yīng)該上路?
- NVIDIA:芯片缺貨有解 維持多元化OEM
- 高手在民間 中國在世界技能大賽特別賽中獲得8枚金牌 位居第一
- Swissbit推出X 78m高耐久性工業(yè)級SATA SSD
- 該總線技術(shù)在全球部署了超過5億個節(jié)點,為汽車智能化趨勢下的數(shù)據(jù)飆升
- 本土份額提高近20%,IDC中國制造業(yè)CAD市場份額報告正式發(fā)布
- 企業(yè)引入自動化,創(chuàng)造完美的客戶體驗
- 4月份臺積電收入58億美元,同比增長55% 也有環(huán)比增長
- SpaceX開始為房車提供星鏈在線服務(wù):價格更貴
- 小鵬汽車:部分車型將終身取消免費充電和家庭充電