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加上这段。

<kvm>
  <hidden state='on'/>
</kvm>

然后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里加上这段。

<kvm>
  <hidden state='on'/>
</kvm>

具体 Pike版的代码如何实现,主要函数是这段

image8

记得在镜像meta里添加 img_hide_hypervisor_id 的字段

image9

8.7.2.3. 是否直通成功

在虚拟机内部执行 nvidia-smiimage10

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 <flavor_id> set pci_passthrough:alias='nvidia:1'

8.7.3.2 镜像配置

openstack image set <IMG-UUID> --property img_hide_hypervisor_id=true

image12