8.7 OpenStack 实现GPU直通¶
8.7.1 环境准备¶
检查是否有 GPU 设备:lspci | grep NVIDIA
(若没有lspci命令,则安装 yum install pciutils -y)
此时查看,驱动是 nvidia
[root@ws_compute11 ~]# lspci -nnk -d 10de:1bb3
03:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:1bb3] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:11d8]
Kernel driver in use: nvidia
04:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:1bb3] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:11d8]
Kernel driver in use: nvidia
修改内核,开启直通,在/etc/default/grub
文件里
GRUB_CMDLINE_LINUX
行,添加 intel_iommu=on
然后重启宿主机。
8.7.2 功能验证¶
8.7.2.2 隐藏虚拟机标识¶
创建gpu直通的虚拟机,在虚拟机内部NIVIDIA显卡的驱动是能检测到自己是跑在虚拟机里的(如下图,先安装
cpuid
再执行cpuid |grep hypervisor_id
,显示KVM),一旦跑在虚拟机里,就会出错,所以我们需要对显卡驱动隐藏hypervisor
id。
(若没有cpuid,则安装 yum install -y cpuid)
如何隐藏 hypervisor id,只需要在xml的feature加上这段。
<kvm>
<hidden state='on'/>
</kvm>
然后destroy再start一下虚拟机,在虚拟机内部再次查看。
在Pike 版本,OpenStack
已经可以根据镜像里是否有img_hide_hypervisor_id=true
的property,来选择是否加上隐藏hypervisor_id的xml。
openstack image set IMG-UUID --property img_hide_hypervisor_id=true
如果你和我们一样使用比Pike 版本还旧的版本( 如Newton ),需要开发者参考 Pike 版本自己修改OpenStack 的源码,在xml里加上这段。
<kvm>
<hidden state='on'/>
</kvm>
具体 Pike版的代码如何实现,主要函数是这段
记得在镜像meta里添加 img_hide_hypervisor_id 的字段
8.7.2.3. 是否直通成功¶
在虚拟机内部执行 nvidia-smi
8.7.2.4 称重器¶
由于 GPU 资源较为稀缺,若普通类型的虚拟机被大量创建在 GPU 的机器上,那 GPU 就会成为一种浪费。为了避免出现这种情况,应该尽量让普通类型的虚拟机都调度到非 GPU 的宿主机上。
因此,需要增加一个称重器,,当创建普通类型的虚拟机时,含 GPU (通过pci_device 设备数来决定)的宿主机的权重为最低,为了保证这点,这个称重器的权重系数应最大,暂定为200(可以通过配置项 ws_gpu_weight_multiplier 设置)。
8.7.3 使用说明¶
在环境部署好,gpu 资源也充足的情况下,想要创建一台gpu直通的虚拟机,还需要确保以下两个步骤完成。
8.7.3.1 模板配置¶
GPU 作为一种硬件资源,同样需要在模板中配置,配置方式是在 flavor 中添加Extra_spec
“pci_passthrough:alias”=“M60:1” : M60是上面控制节点中,在nova.conf 中配置的 pci_alias 别名。1 表示,需要一个gpu设备。
“pci_passthrough:alias”=“P4:2” : P4是上面控制节点中,在nova.conf 中配置的 pci_alias 别名。2 表示,需要两个gpu设备。
nova flavor-key <flavor_id> set pci_passthrough:alias='nvidia:1'