在虚拟化环境中,网络性能往往是瓶颈所在。传统网卡直通(Passthrough)虽然能让虚拟机独占物理网卡,但每块网卡只能分配给一个虚拟机使用。我去年在给公司搭建测试环境时就遇到这个问题——当时用四口网卡做流量隔离测试,结果发现每个测试节点都需要独立网卡,硬件成本直接翻倍。
SR-IOV技术就像给网卡开了"分身术"。我的Intel X520-DA2双口万兆网卡,开启SR-IOV后能虚拟出16个VF(虚拟功能),每个VF都能作为独立网卡分配给不同虚拟机。实测下来,VF的性能损失不到5%,比传统的虚拟网卡(virtio-net)性能提升近10倍。最近用iperf3测试时,单个VF的吞吐量能达到9.8Gbps,延迟稳定在20μs以内。
硬件支持方面,主流服务器网卡基本都支持SR-IOV。我手头的几块网卡情况如下:
| 网卡型号 | 最大VF数量 | 实测稳定性 |
|---|---|---|
| Intel X520-DA2 | 16 | 优秀 |
| Mellanox CX-5 | 32 | 优秀 |
| Realtek 8125B | 4 | 一般 |
提示:使用
lspci -vvv查看网卡详情时,如果输出中包含"Single Root I/O Virtualization (SR-IOV)"字样就说明支持
我的实验环境是一台淘汰的Dell OptiPlex 7060微型机,装了Debian 12系统。关键配置如下:
首先更新系统并安装必要组件:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y qemu-system libvirt-clients virt-manager
然后是激活SR-IOV的关键步骤——修改GRUB配置。我在/etc/default/grub文件中找到GRUB_CMDLINE_LINUX这一行,添加了以下参数:
code复制intel_iommu=on iommu=pt vfio_iommu_type1.allow_unsafe_interrupts=1
更新GRUB后重启:
bash复制sudo update-grub && sudo reboot
重启后先确认IOMMU是否启用:
bash复制dmesg | grep -e DMAR -e IOMMU
看到"DMAR: IOMMU enabled"就说明成功了。
接下来给我的I350网卡创建VF。先查看网卡PCI地址:
bash复制lspci | grep Ethernet
输出中我的网卡地址是01:00.0~01:00.3(四个网口)。创建8个VF(每个物理口2个):
bash复制echo 8 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
用lspci检查会发现新增了8个网络设备,编号通常是01:10.0这种格式。
下载最新的OpenWRT镜像:
bash复制wget https://downloads.openwrt.org/releases/23.05.3/targets/x86/64/openwrt-23.05.3-x86-64-generic-ext4-combined.img.gz
gunzip openwrt-*.img.gz
qemu-img convert -f raw -O qcow2 openwrt-*.img openwrt.qcow2
启动虚拟机时关键是要正确挂载VF。这是我的启动脚本:
bash复制qemu-system-x86_64 \
-name OpenWRT-SRIOV \
-enable-kvm \
-cpu host \
-smp 2 \
-m 1G \
-drive file=openwrt.qcow2,if=virtio \
-device vfio-pci,host=01:10.0 \
-device vfio-pci,host=01:10.1 \
-nographic \
-net none
这里把01:10.0和01:10.1两个VF分配给了OpenWRT。第一次启动时需要按Enter激活控制台,然后执行passwd修改root密码。
通过SSH登录后(默认IP是192.168.1.1),先修改网络配置。编辑/etc/config/network文件:
code复制config device
option name 'eth0'
option macaddr '00:11:22:33:44:55'
config interface 'lan'
option device 'eth0'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
config interface 'wan'
option device 'eth1'
option proto 'dhcp'
这里eth0对应第一个VF作为LAN口,eth1作为WAN口。保存后执行:
bash复制/etc/init.d/network restart
在宿主机上可以调整VF的队列数量提升性能。先查看当前配置:
bash复制ethtool -l eth0
输出中的Combined字段显示队列数。我一般设置为CPU核心数:
bash复制ethtool -L eth0 combined 2
OpenWRT这边也需要调整中断平衡:
bash复制opkg install irqbalance
/etc/init.d/irqbalance enable
/etc/init.d/irqbalance start
上周帮朋友部署时就遇到VF无法识别的问题。解决方法是在BIOS中确认:
另一个典型问题是VF创建失败:
bash复制echo 8 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
-bash: echo: write error: Cannot allocate memory
这是因为内存不足,需要先卸载网卡驱动:
bash复制modprobe -r igb
modprobe igb max_vfs=8
最后分享一个监控VF流量的实用命令:
bash复制watch -n 1 "cat /proc/interrupts | grep -E 'eth|VF'"