目录
一、什么是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) |