1. 硬件兼容性检查你的设备能玩转GPU直通吗第一次尝试在CentOS 7上配置KVM GPU直通时我踩过的最大坑就是硬件兼容性问题。当时兴冲冲地买了块二手Tesla显卡结果发现主板根本不支持IOMMU白白折腾了两天。为了避免你们重蹈覆辙这里把硬件检查的要点掰开揉碎讲清楚。CPU和主板是基础关卡。就像盖房子需要打地基GPU直通需要CPU支持VT-dIntel或AMD-ViAMD技术。检查方法很简单在终端运行cat /proc/cpuinfo | grep --color vmx # Intel处理器 cat /proc/cpuinfo | grep --color svm # AMD处理器如果能看到输出说明CPU虚拟化支持已开启。但光有这个还不够就像汽车光有发动机不行还得有变速箱必须确认BIOS里开启了IOMMU功能。以我的华硕主板为例需要在Advanced→System Agent Configuration→VT-d菜单中启用。显卡兼容性最容易翻车。去年帮客户调试时遇到过NVIDIA Quadro K2200死活无法直通的情况后来发现是显卡固件不支持UEFI。建议用这个命令先确认显卡信息lspci -nn | grep -i nvidia输出中的设备ID如[10de:13c2]需要去NVIDIA官网查证是否支持SR-IOV。有个小技巧2016年后发布的专业卡Tesla/Quadro基本都支持消费级显卡要看运气。内存容量常被忽视。我建议宿主机至少保留16GB内存因为GPU显存会被锁定无法共享。曾经有个深度学习项目虚拟机分配了4块GPU总共48GB显存结果宿主机因为内存不足直接卡死。用下面的命令可以估算需要预留的内存nvidia-smi -q | grep -A 3 FB Memory Usage2. 宿主机环境配置让系统准备好迎接直通搞定硬件只是万里长征第一步就像装修房子得先拆旧墙。CentOS 7默认配置需要动几个关键手术这里分享我优化过的配置方案。内核参数是灵魂所在。修改/etc/default/grub文件时建议添加这些参数GRUB_CMDLINE_LINUX... intel_iommuon iommupt pcie_acs_overridedownstream,multifunction nofb nomodeset videovesafb:off其中pcie_acs_override能解决设备组隔离问题nofb参数可以避免帧缓冲区冲突。更新配置后别急着重启先用这个命令验证参数是否正确grub2-mkconfig | grep iommuVFIO驱动绑定是个技术活。创建/etc/modprobe.d/vfio.conf时我发现很多人漏掉了disable_vga参数options vfio-pci ids10de:13c2,10de:0fbb disable_vga1后面的设备ID需要替换成你的显卡和音频设备ID如果有独立音频设备。有个坑要注意部分NVIDIA显卡需要额外禁用nouveau驱动echo blacklist nouveau /etc/modprobe.d/blacklist.conf服务管理有讲究。重启前建议先停用显示管理器systemctl stop gdm systemctl mask gdm这样可以避免Xorg占用GPU导致直通失败。我曾经因为没做这一步调试了整整一天。3. QEMU环境调优打造高性能虚拟化底座原生的QEMU在CentOS 7上就像老牛拉破车必须升级改造才能发挥GPU性能。经过多次测试我总结出这套优化方案。版本选择有门道。官方源的qemu-kvm版本太旧必须启用EV仓库yum install -y centos-release-qemu-ev sed -i s/enabled0/enabled1/g /etc/yum.repos.d/CentOS-QEMU-EV.repo yum update -y qemu-kvm升级后检查版本至少要2.12以上否则会有PCIe通道带宽问题/usr/libexec/qemu-kvm -version虚拟机芯片组要选对。创建虚拟机时必须使用q35芯片组就像盖楼房要选对钢结构/usr/libexec/qemu-kvm -machine help | grep q35我推荐使用pc-q35-rhel7.6.0这个版本它在稳定性和性能之间取得了最好平衡。内存大页能提升性能。对于深度学习场景配置1GB大页效果显著echo vm.nr_hugepages 32768 /etc/sysctl.conf sysctl -p计算大页数量的公式是(虚拟机内存 GPU显存) / 2MB 缓冲。比如要给虚拟机分配64GB内存显卡有16GB显存那就需要(6553616384)/2102434816。4. 虚拟机部署实战手把手带你完成最后冲刺终于来到最激动人心的环节就像组装电脑最后按下开机键的那一刻。下面是我经过数十次实践验证的最佳配置方案。创建虚拟磁盘有技巧。建议使用qcow2格式并预分配空间qemu-img create -f qcow2 -o preallocationmetadata /var/lib/libvirt/images/gpu-vm.qcow2 500G我曾经测试过预分配可以使TensorFlow模型加载速度提升20%。对于IO密集型应用还可以添加缓存策略disk typefile devicedisk driver nameqemu typeqcow2 cachenone ionative/ /diskCPU拓扑影响性能。正确的vcpu配置应该反映物理核心结构virsh vcpupin gpu-vm 0 0-3 virsh vcpupin gpu-vm 1 4-7比如在双路服务器上应该让虚拟机的vCPU均匀分布在两个物理CPU上。可以通过这个命令查看拓扑lstopo --of txtPCI设备附加要完整。除了GPU本体别忘了音频设备virsh nodedev-list | grep -i audio在XML配置中设备定义应该像这样hostdev modesubsystem typepci managedyes source address domain0x0000 bus0x3b slot0x00 function0x0/ /source address typepci domain0x0000 bus0x00 slot0x05 function0x0/ /hostdev最后提醒一个血泪教训首次启动虚拟机时一定要先安装好驱动再启用GPU直通。我有次直接附加GPU导致虚拟机启动黑屏最后只能重装系统。正确的做法是先用标准VGA安装系统然后安装对应版本的NVIDIA驱动最后才添加GPU设备。