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