目录

一、什么是vGPU?

二、为什么需要vGPU?

三、架构及原理

四、Libvirt创建vGPU虚机

1、物理环境准备,服务器接入pGPU物理卡

2、升级最新kernel、libvirt、qemu

3、服务器部署vgpu-kvm驱动

4、mdev设备的创建

5、mdev设备删除

6、libvirt vGPU实例创建

7、搭建NVIDIA License Server(linux)


一、什么是vGPU?

vGPU,即虚拟GPU,是基于GPU的虚拟化技术,提供了在云服务器上搭载虚拟GPU的能力。

通过GPU虚拟化,多个虚机可以共享使用同一个物理GPU,可以降低成本、提升可扩展性。

 

二、为什么需要vGPU?

1、价格低

对用户来说,物理GPU价格偏高,针对GPU使用率不高的应用场景,选择vGPU更合适。

2、提高利用率

在云计算应用场景下,虚拟机需要使用vGPU实现VDI、循环计算等应用,出于成本考虑,一般不会让每个虚机都分配一个GPU硬件,此时就需要对GPU卡进行分片,即vGPU在hypervisor层实现GPU的虚拟化

3、应用场景灵活

vGPU可以针对不同类型的物理GPU卡,划分不同类型的粒度切割,根据应用场景选择不同类型不同粒度的vGPU卡,例如Tesla-T4、Tesla-V100分别适用于不同的场景。

 

三、架构及原理

GPU虚拟化规划思路 开源gpu虚拟化_OpenStack

 

四、Libvirt创建vGPU虚机

1、物理环境准备,服务器接入pGPU物理卡

BIOS开启vt-d(Internel I/O虚拟化技术);

配置raid,部署计算节点iso(基于CentOS7)

2、升级最新kernel、libvirt、qemu

1)systemd禁用ksm、ksmtuned

KSM(Kernel Samepage Merging)内核中的一种内存共享机制,2.6.32引入,允许系统通过合并相同内存页面,减少冗余。

2)kernel开启iommu

修改 /etc/default/grub, 在"GRUB_CMDLINE_LINUX ”选项中添加"intel_iommu=on iommu=pt"

重启服务器后,/sys/kernel/iommu_groups/目录不为空

3)reload driver

修改 /etc/default/grub  , 在"GRUB_CMDLINE_LINUX ”选项的末尾添加“rdloaddriver=mlx5_core rdloaddriver=i40e rdloaddriver=ixgbe”

4)重新生成grub.cfg

grub2-mkconfig -o /boot/grub2/grub.cfg

5)设置内存大页

6)vfio相关驱动加载

在/etc/rc.local中初始化加载相关模块,或者直接执行以下命令生效:

modprobe vfio_pci

modprobe vfio_mdev

扩展:

mdev.ko是mdev core模块,包括了mdev的绝大多数核心功能。该模块在Device Model中定义了一种新的Bus即mdev总线,而vfio_mdev.ko则是定义了mdev总线上的一种Driver,用来实现和VFIO的对接,换句话说就是起到和vfio-pci驱动相同的作用。

7)重启使内核生效

验证是否生效的方法(现象顺序依赖):
物理机识别NVIDIA设备;
vifo设备正常加载;
iommu_groups目录不为空;
virsh命令可看到mdev设备

[root@compute-gpu vgpufile]# lspci | grep 3D 
3d:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
3e:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
40:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
41:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
b1:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
b2:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
b4:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
b5:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
[root@compute-gpu ~]# ll /dev/vfio/vfio
crw-rw-rw- 1 root root 10, 196 Apr  2 15:07 /dev/vfio/vfio
[root@compute-gpu ~]# ls /sys/kernel/iommu_groups/
0  10  12  14  16  18  2   21  23  25  27  29  30  32  34  36  38  4   41  43  45  47  49  50  52  54  56  58  6   61  63  65  67  69  70  72  74  76  78  8   81  83  85  87  89  90  92  94  96
1  11  13  15  17  19  20  22  24  26  28  3   31  33  35  37  39  40  42  44  46  48  5   51  53  55  57  59  60  62  64  66  68  7   71  73  75  77  79  80  82  84  86  88  9   91  93  95  97
[root@compute-gpu ~]# virsh nodedev-list | grep mdev
mdev_889d09aa_b35b_4aba_bec6_ad581bc77401
mdev_cddff9f1_3ffb_4fb1_a1fd_24b3a2c5f8d0
mdev_f772d728_bf12_4d88_bf7d_990b802cd185
[root@compute-gpu ~]# virsh nodedev-dumpxml mdev_889d09aa_b35b_4aba_bec6_ad581bc77401
<device>
  <name>mdev_889d09aa_b35b_4aba_bec6_ad581bc77401</name>
  <path>/sys/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.0/0000:3c:00.0/0000:3d:00.0/889d09aa-b35b-4aba-bec6-ad581bc77401</path>
  <parent>pci_0000_3d_00_0</parent>
  <driver>
    <name>vfio_mdev</name>
  </driver>
  <capability type='mdev'>
    <type id='nvidia-319'/>
    <iommuGroup number='95'/>
  </capability>
</device>

3、服务器部署vgpu-kvm驱动

1)上传驱动到物理服务器,并安装

# ./NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run

2)配置DISABLED Toggle ECC support

# nvidia-smi -e 0

3)配置Set persistence mode ENABLED

# nvidia-smi -pm 1

执行过程:

[root@compute-gpu vgpufile]# file NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run 
NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run: data
[root@compute-gpu vgpufile]# chmod +x NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run 
[root@compute-gpu vgpufile]# ./NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run -s
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 430.67...........................................................................................................................................................................................................
[root@compute-gpu vgpufile]# nvidia-smi -e 0
Disabled ECC support for GPU 00000000:3D:00.0.
Disabled ECC support for GPU 00000000:3E:00.0.
Disabled ECC support for GPU 00000000:40:00.0.
Disabled ECC support for GPU 00000000:41:00.0.
Disabled ECC support for GPU 00000000:B1:00.0.
Disabled ECC support for GPU 00000000:B2:00.0.
Disabled ECC support for GPU 00000000:B4:00.0.
Disabled ECC support for GPU 00000000:B5:00.0.
All done.
Reboot required.
[root@compute-gpu vgpufile]# nvidia-smi -pm 1
Enabled persistence mode for GPU 00000000:3D:00.0.
Enabled persistence mode for GPU 00000000:3E:00.0.
Enabled persistence mode for GPU 00000000:40:00.0.
Enabled persistence mode for GPU 00000000:41:00.0.
Enabled persistence mode for GPU 00000000:B1:00.0.
Enabled persistence mode for GPU 00000000:B2:00.0.
Enabled persistence mode for GPU 00000000:B4:00.0.
Enabled persistence mode for GPU 00000000:B5:00.0.
All done.
[root@compute-gpu vgpufile]#

4、mdev设备的创建

选定物理GPU初始化的vGPU类型,并写入对应的mdev设备中

1)查看服务器上所有的GPU设备,可以用脚本遍历获取所有物理GPU设备列表

lspci命令过滤,获取所有GPU物理设备的pci设备识别号,例如:3d:00.0、3e:00.0 .....

2)获取每个物理GPU对应vGPU支持的所有类型vgpu_types,例如:nvidia-222、nvidia-223 .....

3)mdev设备的创建方法

通过向/sys/devices/<device path>/mdev_supported_types/<type id>/create输入一个UUID,就可以创建一个<type id>类型的Mediated Device。

例如:向/sys/bus/pci/devices/0000:3d:00.0/mdev_supported_types/nvidia-319/create中注入一个UUID:889d09aa-b35b-4aba-bec6-ad581bc77401,则表示创建一个类型为nvidia-319的mdev设备,设备uuid为:889d09aa-b35b-4aba-bec6-ad581bc77401,设备name为:T4-4C。

4)随机生成的uuid,写入选中的vgpu type目录下的create文件中,uuid写入方式有以下两种:

a,自定义shell脚本实现 ;

b,openstack实现,nova读取配置文件中的nvidia类型,生成uuid写入对应create

    例如:配置管理员准备给第一个物理GPU设备,配置vgpu类型为"nvidia-319",对应name为"T4-4C"的vGPU,那么,把随机生成的uuid: 889d09aa-b35b-4aba-bec6-ad581bc77401,写入/sys/bus/pci/devices/0000:3d:00.0/mdev_supported_types/nvidia-319/create文件中。

    创建虚机时,xml中mdev标签地址指定此uuid,则创建的虚机就可以直接识别到此vGPU设备。

5、mdev设备删除

销毁mdev设备,只需要向设备对应路径的remove文件中写入1即可,格式如下:

# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove
# echo 1 > /sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001/remove

remove 文件是只写文件,往其中写”1″会销毁mdev设备。

如果该mdev设备正在使用,且该供应商驱动程序不支持热拔插,那么直接写入remove会调用失败。可以先执行关机再删除。

6、libvirt vGPU实例创建

1)libvirt创建实例的xml中,添加vGPU对应mdev设备信息,注入mdev设备对应的uuid,然后使用virsh create --file命令,指定xml文件创建vGPU实例。

vGPU本质上是mdev设备,因此xml中定义的类型:  type='mdev'

mdev设备的唯一标识符则是uuid,因此 xml中有:  <address uuid='889d09aa-b35b-4aba-bec6-ad581bc77401'/>

......
    <hostdev mode='subsystem' type='mdev' managed='yes' model='vfio-pci' display='off'>
      <source>
        <address uuid='889d09aa-b35b-4aba-bec6-ad581bc77401'/>
      </source>
      <alias name='hostdev0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </hostdev>
......

2)在guest用户镜像中,安装NVIDIA的grid驱动。(若使用已部署好grid的用户镜像,则跳过)

下载驱动包到虚机镜像中;

修改权限: chmod +x NVIDIA-Linux-x86_64-430.30-grid.run

执行安装: ./NVIDIA-Linux-x86_64-430.30-grid.run 

重启生效: reboot

3)guest实例中配置连接licserver(需要提前搭建好本地的licenseServer虚机,并注入购买license,详见第6步)

    a.切换到/etc/nvidia目录:cd /etc/nvidia

    b.创建gridd.conf文件: cp gridd.conf.template gridd.conf

    c.在gridd.conf文件中添加license服务器信息

        i. ServerAddress=License服务器的IP

        ii. ServerPort=License服务器的端口(默认为7070)

        iii. FeatureType

(6)  systemctl restart nvidia-gridd

(7)  systemctl status nvidia-gridd //检查是否成功获取了license,若成功获取,显示:License acquired successfully.

至此,vGPU实例创建成功。

GPU虚拟化规划思路 开源gpu虚拟化_OpenStack_02

7、搭建NVIDIA License Server(linux)

1)NVIDIA官网申请临时测试License、或购买License【NVIDIA官网访问不稳定,用梯子】

2)若有已安装licenseServer的镜像,则跳过,直接用镜像部署License实例【生成license授权文件需要提供LicenseServer的mac地址】

(a)安装桌面版linux,配置不低于4c16G,有固定的ip和mac

(b)安装java运行时 # yum install java

(c)安装tomcat

# yum install tomcat tomcat-webapps

# systemctl enable tomcat.service && systemctl start tomcat.service

(d)下载license-server文件并安装

下载文件 Nvidia-ls-linux****.zip

# unzip  Nvidia-is-linux****.zip

# chmod +x setup.bin

安装setup.bin (可以图形化安装、可以命令行安装)

3)登录NVIDIA官网,使用申请的license,根据license-server的mac地址,创建licenseServer需要使用的授权文件license_****.bin

4)把license_****.bin文件导入License实例的8080服务页面。

获取的license文件license_****.bin,在http://localhost:8080/licserver页面上传导入。

参考:

https://docs.nvidia.com/grid/latest/grid-vgpu-user-guide/index.html#red-hat-el-kvm-install-configure-vgpu

https://www.kernel.org/doc/html/latest/driver-api/vfio-mediated-device.html