8.7 OpenStack 实现GPU直通 ========================= |image0| 8.7.1 环境准备 -------------- 检查是否有 GPU 设备:\ ``lspci | grep NVIDIA`` (若没有lspci命令,则安装 yum install pciutils -y) |image1| 此时查看,驱动是 nvidia |image2| :: [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.1 Driver 变化 ~~~~~~~~~~~~~~~~~~~ **下面将观察创建虚拟机前后 driver 的变化** 未创建虚拟机 |image3| 创建gpu虚拟机成功,driver 由 nvidia 变为 vfio-pci |image4| 删除虚拟机成功 |image5| 8.7.2.2 隐藏虚拟机标识 ~~~~~~~~~~~~~~~~~~~~~~ 创建gpu直通的虚拟机,在虚拟机内部NIVIDIA显卡的驱动是能检测到自己是跑在虚拟机里的(如下图,先安装 ``cpuid`` 再执行\ ``cpuid |grep hypervisor_id`` ,显示KVM),一旦跑在虚拟机里,就会出错,所以我们需要对显卡驱动隐藏hypervisor id。 (若没有cpuid,则安装 yum install -y cpuid) |image6| 如何隐藏 hypervisor id,只需要在xml的feature加上这段。 .. code:: xml 然后destroy再start一下虚拟机,在虚拟机内部再次查看。 |image7| 在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里加上这段。 .. code:: xml 具体 Pike版的代码如何实现,主要函数是这段 |image8| 记得在镜像meta里添加 img_hide_hypervisor_id 的字段 |image9| 8.7.2.3. 是否直通成功 ~~~~~~~~~~~~~~~~~~~~~ 在虚拟机内部执行 nvidia-smi\ |image10| 8.7.2.4 称重器 ~~~~~~~~~~~~~~ 由于 GPU 资源较为稀缺,若普通类型的虚拟机被大量创建在 GPU 的机器上,那 GPU 就会成为一种浪费。为了避免出现这种情况,应该尽量让普通类型的虚拟机都调度到非 GPU 的宿主机上。 因此,需要增加一个称重器,,当创建普通类型的虚拟机时,含 GPU (通过pci_device 设备数来决定)的宿主机的权重为最低,为了保证这点,这个称重器的权重系数应最大,暂定为200(可以通过配置项 ws_gpu_weight_multiplier 设置)。 |image11| 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 set pci_passthrough:alias='nvidia:1' 8.7.3.2 镜像配置 ~~~~~~~~~~~~~~~~ :: openstack image set --property img_hide_hypervisor_id=true -------------- |image12| .. |image0| image:: http://image.iswbm.com/20200602135014.png .. |image1| image:: http://image.iswbm.com/20190419144135.png .. |image2| image:: http://image.iswbm.com/20190419144044.png .. |image3| image:: http://image.iswbm.com/20190422201117.png .. |image4| image:: http://image.iswbm.com/20190422201041.png .. |image5| image:: http://image.iswbm.com/20190422201117.png .. |image6| image:: http://image.iswbm.com/20190422205222.png .. |image7| image:: http://image.iswbm.com/20190422204755.png .. |image8| image:: http://image.iswbm.com/20190528105408.png .. |image9| image:: http://image.iswbm.com/20190528105021.png .. |image10| image:: http://image.iswbm.com/20190528114526.png .. |image11| image:: http://image.iswbm.com/20190606185531.png .. |image12| image:: http://image.iswbm.com/20200607174235.png