4. DPU上的SR-IOV虚拟化

任务目标

在BlueField-3 DPU上启用SR-IOV,将物理端口划分为多个虚拟功能(VF),并将VF分配给虚拟机使用,最后验证VF的网络连通性与基本性能。

环境与依赖

  • BlueField-3 DPU(本文以BF3为例,BF2操作相同)
  • DPU已安装DOCA 2.x或更高版本,且具备mlnx-sf/iproute2工具
  • 宿主机(x86/ARM)已安装libvirt或qemu-kvm,用于虚拟机管理
  • DPU的物理端口已配置为以太网模式(非InfiniBand)

实现步骤与代码

SR-IOV在DPU上的启用分为两个层面:首先在DPU的嵌入式系统(eSwitch)上创建VF,然后将VF通过PCIe直通分配给宿主机上的虚拟机。以下操作均在DPU的ARM子系统(即BlueField OS)上执行。

1. 启用SR-IOV并创建VF

查看当前PF(物理功能)的SR-IOV能力,并创建8个VF:

# 查看PF接口(通常为p0)
ip link show

# 启用SR-IOV,创建8个VF
echo 8 > /sys/class/net/p0/device/sriov_numvfs

# 确认VF已创建
ip link show | grep -A 5 "p0"
# 预期输出:出现 vf 0 - vf 7 的条目

2. 配置VF的MAC地址与VLAN

为每个VF分配唯一的MAC地址,并设置默认VLAN(可选):

# 为VF 0-7设置MAC地址(示例)
for i in $(seq 0 7); do
    mac=$(printf "02:00:00:00:00:%02x" $i)
    ip link set p0 vf $i mac $mac
done

# 查看VF配置
ip link show p0

3. 将VF分配给虚拟机

在宿主机上,VF会以PCIe设备形式呈现。使用virsh将VF附加到虚拟机:

# 在宿主机上查看VF对应的PCI地址
lspci | grep -i ethernet | grep "Virtual Function"

# 假设VF0的PCI地址为 0000:03:00.0,附加到虚拟机 vm1
virsh attach-interface vm1 --type hostdev --source 0000:03:00.0 --model virtio --config --live

4. 虚拟机内网络配置与连通性测试

在虚拟机内配置IP地址并测试连通性:

# 在虚拟机内(假设VF被识别为eth0)
ip addr add 192.168.100.10/24 dev eth0
ip link set eth0 up

# 从宿主机ping虚拟机(需在宿主机侧配置同网段IP)
ping 192.168.100.10

5. 性能验证

使用iperf3测试VF的TCP/UDP吞吐量:

# 在虚拟机内启动iperf3服务端
iperf3 -s -p 5201 &

# 在宿主机(或另一台机器)上运行客户端
iperf3 -c 192.168.100.10 -p 5201 -t 10

验证方法与判定标准

  • VF创建成功:ip link show p0能列出8个VF条目,且每个VF有独立的MAC地址。
  • 虚拟机识别VF:在虚拟机内执行lspci | grep Ethernet能看到对应的VF设备,且ip link能看到网卡接口。
  • 连通性通过:宿主机与虚拟机之间ping通,丢包率为0%。
  • 性能达标:iperf3测试结果中,TCP吞吐量应接近物理端口线速(例如25GbE端口应达到约23Gbps以上),UDP测试无大量丢包。

常见问题

  • VF创建失败:确认DPU的eSwitch模式为switchdev,且物理端口已up。执行devlink dev eswitch set pci/0000:03:00.0 mode switchdev切换模式。
  • 虚拟机无法识别VF:检查宿主机BIOS/内核是否开启IOMMU(intel_iommu=on或amd_iommu=on),并确认VF已通过virsh正确附加。
  • 性能不达标:确认虚拟机使用virtio-net驱动且开启了多队列(ethtool -L eth0 combined 4),并检查DPU上的流表规则未限制带宽。
DPU SR-IOV 架构与数据路径 宿主机 (x86/ARM) VM1 VF0驱动 VM2 VF1驱动 VM3 VF2驱动 ... 最多8个VF PCIe SR-IOV 直通 BlueField-3 DPU (ARM子系统) eSwitch VF 0-7 转发规则 流表/ACL VF0 VF1 VF2 ... VF7 物理端口 (p0) - 25GbE/100GbE 外部网络 / 数据中心

上图展示了SR-IOV在DPU上的整体架构:宿主机上的多个虚拟机通过PCIe直通各自独占一个VF,DPU上的eSwitch负责VF之间的隔离与转发,所有流量最终通过物理端口p0与外部网络交互。每个VF拥有独立的MAC地址和队列资源,数据路径不经过宿主机内核协议栈,从而获得接近线速的性能。