AI服务器GPU SR-IOV配置:虚拟机共享物理显卡的实操步骤
SR-IOV(Single Root I/O Virtualization)把一块物理GPU拆成多个虚拟功能(VF),每个VF可以独立直通给一台虚拟机,性能接近物理直通,适合多租户AI推理或开发环境。
但并非所有GPU都支持SR-IOV,配置前必须先确认硬件和固件条件,否则后续步骤无法生效。
先确认硬件和固件是否支持
SR-IOV依赖GPU本身、主板BIOS和IOMMU分组三方面支持。
执行以下命令检查:
lspci -nn | grep -i nvidia
记录GPU的PCI地址(如0000:3b:00.0)。
然后查看该设备是否支持SR-IOV能力:
lspci -vvv -s 0000:3b:00.0 | grep -i sriov
如果输出包含Single Root I/O Virtualization且Initial VFs大于0,说明硬件支持。
接着在BIOS中开启SR-IOV、Above 4G Decoding和IOMMU(Intel平台为VT-d,AMD平台为AMD-Vi)。
重启后检查内核是否启用IOMMU:
dmesg | grep -e DMAR -e IOMMU
看到DMAR: IOMMU enabled即表示IOMMU已工作。
若没有输出,需在GRUB中添加intel_iommu=on iommu=pt(AMD平台用amd_iommu=on)并更新grub后重启。
创建VF并绑定到vfio-pci
确认支持后,通过sysfs创建VF。
以NVIDIA A100为例,先查看最大VF数:
cat /sys/class/net/eno1/device/sriov_numvfs 2>/dev/null || true
cat /sys/bus/pci/devices/0000:3b:00.0/sriov_totalvfs
假设sriov_totalvfs返回8,创建4个VF:
echo 4 > /sys/bus/pci/devices/0000:3b:00.0/sriov_numvfs
lspci | grep -i 'virtual function'
此时会看到新增的VF设备。
为了让虚拟机直接接管VF,需要把VF绑定到vfio-pci驱动。
先获取VF的PCI地址,然后执行:
modprobe vfio-pci
vfio-pcibind=$(lspci -n -s 0000:3b:00.1 | awk '{print $3}')
echo $vfio-pci > /sys/bus/pci/drivers/vfio-pci/new_id
echo 0000:3b:00.1 > /sys/bus/pci/drivers/vfio-pci/bind
注意:绑定前确保VF没有被其他驱动占用,可用lspci -k -s 0000:3b:00.1查看当前驱动。
绑定后lspci -k应显示Kernel driver in use: vfio-pci。
在KVM虚拟机中直通VF
使用virt-manager或virsh edit为虚拟机添加PCI主机设备。
找到虚拟机的XML配置文件,在段内加入:
启动虚拟机后,在虚拟机内执行lspci | grep -i nvidia应能看到对应的VF设备。
安装NVIDIA驱动后,nvidia-smi会显示该VF对应的GPU实例。
常见报错与避坑
- 创建VF时提示
Write failed: Invalid argument:通常表示GPU不支持SR-IOV或BIOS未开启相关选项,回到第一步检查。 - 虚拟机启动后看不到GPU:检查VF是否已绑定到
vfio-pci,以及虚拟机XML中PCI地址是否正确(注意function号)。 - 性能远低于预期:SR-IOV VF共享物理GPU的显存带宽,多VF同时高负载时会出现争抢,适合推理等轻量场景,不适合大规模训练。
- 重启后VF消失:sysfs配置不是永久性的,需要将创建VF和绑定驱动的命令写入systemd服务或udev规则。
验证配置是否生效
在宿主机上确认VF数量:
ls /sys/bus/pci/devices/0000:3b:00.0/ | grep virtfn
在虚拟机内运行nvidia-smi -L应列出GPU实例。
如果虚拟机内驱动加载失败,检查宿主机是否将VF正确隔离,并确认虚拟机XML中未同时分配整卡。
SR-IOV配置对硬件和固件要求较高,建议先在测试环境验证再上生产。
如果GPU不支持SR-IOV,可考虑GPU直通或vGPU方案,根据业务对隔离性和性能的需求选择。