当前位置: > 其它学习 > vGPU >

基于libvirt创建vGPU实例

时间:2021-10-27 11:03来源:linux.it.net.cn 作者:IT
目录
 
一、什么是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分别适用于不同的场景。
 
 
 
三、架构及原理
 
 
 
四、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实例创建成功。



 
 
 
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
 



(责任编辑:IT)
------分隔线----------------------------