0x01 前言

对于使用Windows虚拟桌面进行日常远程工作的应用场景,使用NVIDIA vGPU可以极大地优化使用体验。

在使用VMware虚拟的SVGA驱动在进行图形化操作,如:Office软件,甚至使用浏览器浏览网页的时候都会出现明显调帧卡顿的问题,使用体验较本地电脑有明显差距,会极大地降低工作效率。使用NVIDIA Tesla系列显卡可以为虚拟桌面加上硬件加速,因为需要购买显卡及License,单一虚拟机的成本会上升明显,但工作效率也因此得以提高。

在实际应用中,使用Office软件、Teams、WhatsApp和WeChat等IM软件明显流畅,使用浏览器浏览网页、浏览PDF和使用一些绘图软件也有改善。

0x02 准备

首先确认需求,vGPU目前有以下类型:

Series Optimal Workload
Q-series Virtual workstations for creative and technical professionals who require the performance and features of Quadro technology
C-series Compute-intensive server workloads, such as artificial intelligence (AI), deep learning, or high-performance computing (HPC)
B-series Virtual desktops for business professionals and knowledge workers
A-series App streaming or session-based solutions for virtual applications users

在我的应用环境中,虚拟桌面的定位为日常工作,所以选择B系列。不通系列的License授权费用可能有差异,具体需要向供应商确认。计费方式主要有2种:订阅和买断。订阅授权的年费为每个授权HKD $420左右,买断则需要强制购买5年技术支持,每个授权合计需要HKD $1800左右。两种授权使用大概5年的时候,总花费出现交叉,使用超过5年的时候,买断比订阅便宜。

vGPU的授权其实是不绑定显卡和设备的,需要私有化部署License Server,虚拟机内安装的驱动需要填写这台License Server的IP地址。当虚拟机关机,就会释放1个License,驱动启动的时候会重新申请1个。

确认好需求也知道大致费用后,在选择显卡型号前需要知道每台服务器大致放多少台虚拟机。按设计,我一般会放置15台左右,而且我的使用环境为虚拟桌面,所以每台虚拟机分配1G显存即可,这样可以选择2块8G内存的显卡或1块16G内存的显卡。

一般情况下,确认好显存就可以开始选择显卡。但对于计算型的场景,还需要确认vGPU核心数量,因为某些高端型号每块板卡所支持的vGPU数量非常多,比如:Tesla M10就支持高达64个vGPU。这时候确认每台虚拟机的内存和CPU核心型号是很重要的工作,因为要确认每台物理服务器能承载多少台虚拟机,这时候才能确认这些vGPU是否都能用上,如果都用上,是否存在性能瓶颈,毕竟各个组件间是相互制衡的。

综上,我环境中的虚拟桌面每台需要24~32G内存,4~8vCPU,那么一台服务器需要328G~512G内存,最多放置16台虚拟机。显卡有这些选择:2个M6、1个P100 16G、2个P4、1个T4、1个V100 16G,实际选用2个P4。

然后确认vGPU Type,比如我选择的B系列有以下Type,这里选用P4-1B:

上图中的P4-2B4和P4-1B4已经弃用,在后续的驱动中会移除。

这个vGPU Type在VMware中会以一个profile体现,需要在vCloud内配置和分配,对应的OVDC下的虚拟机才能使用。

还需要到NVIDIA许可门户网站下载对应的驱动和License Server软件或虚拟机模版,这篇文章不涉及License Server的部署及配置,软件版本选用14.1,后续会应用一个脚本:

压缩包内包含VMware ESXi 7.0.2的VIB文件和Windows等系统的驱动:

最后准备vCloud等环境,至此,准备工作完成。

0x03 部署

将显卡装入服务器内,如果一切正常,可以在Graphics Devices中找到相关设备:

然后打开SSH服务,解压以下文件并将其中的VIB文件上传至Host的/tmp目录中:

NVD-VGPU_510.73.06-1OEM.702.0.0.17630552_19796074.zip

NVIDIA_bootbank_NVIDIA-VMware_ESXi_7.0.2_Driver_510.73.06-1OEM.702.0.0.17630552.vib

然后执行以下命令:

esxcli software vib install -v /tmp/NVIDIA_bootbank_NVIDIA-VMware_ESXi_7.0.2_Driver_510.73.06-1OEM.702.0.0.17630552.vib

虽然不要求重启,但我建议重启一遍:

[root@esxi:~] esxcli software vib install -v /tmp/NVIDIA_bootbank_NVIDIA-VMware_ESXi_7.0.2_Driver_510.73.06-1OEM.702.0.0.17630552.vib
Installation Result
   Message: Operation finished successfully.
   Reboot Required: false
   VIBs Installed: NVIDIA-vGPU-VMware_ESXi_7.0.2_Host_Driver_510.73.06-1OEM.702.0.0.17630552
   VIBs Removed:
   VIBs Skipped:

最后确认:

# 确认软件包的安装及内核加载情况
[root@localhost:~] vmkload_mod -l | grep nvidia
nvidia                         995   35828

# 检查GPU
[root@localhost:~] nvidia-smi
Mon Jan 30 21:43:43 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.73.06    Driver Version: 510.73.06    CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla P4            On   | 00000000:04:00.0 Off |                    0 |
| N/A   28C    P8    10W /  75W |   1899MiB /  7680MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P4            On   | 00000000:82:00.0 Off |                  Off |
| N/A   37C    P8    10W /  75W |   1028MiB /  8192MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A   2172725    C+G   xxx-xxxxx-xxxx                   1046MiB |
|    0   N/A  N/A   2494912    C+G   xxx-xxxxx-xxxx                    936MiB |
|    1   N/A  N/A   2215092    C+G   xxx-xxxxx-xxxx                   1734MiB |
+-----------------------------------------------------------------------------+

至此,完成部署工作。

0x04 配置

0x04.1 PVDC

首先到PVDC中添加vGPU Policy:

首先选择vGPU Profile:

应用到目标OVCD中,这里可以选NO,然后手动在OVDC中应用亦可:

接下来是应用到虚拟机中,因为授权和资源有限,建议选NO后在虚拟机中手动配置:

然后是CPU和内存资源的预留设定,因为这属于PCI设备,需要预留100%的资源。我倾向于在OVDC中设置,所以这里选NO:

最后是检查确认:

完成后,可以看到OVDC名称旁边会出现一个NVIDIA的LOGO:

0x04.2 OVDC

首先调整OVDC中资源预留的设定,将CPU和内存预留设置为100%:

然后定位到vGPU标签,添加刚才在PVDC中创建的vGPU Profile:

至此,完成OVDC的配置。

0x04.3 虚拟机

在虚拟机配置界面中定位到Hardware –> Compute标签,单击vGPU Policy上面的Edit,选择目标Policy后单击SAVE即可:

如果是迁移进来的虚拟机,还需要确认CPU和内存的预留情况,可以在vCPU和内存设置界面中直接单击确认,vCloud会自动调整。

最后启动虚拟机即可。

0x05 驱动

启动虚拟机后先安装vmtools,然后安装驱动,最后重启一遍:

512.78_grid_win10_win11_server2016_server2019_server2022_64bit_international.exe

重启之后会提示许可证不存在:

此时可以右击桌面打开NVIDIA控制面板,在管理许可证页面内填入License Server的IP或域名:

如果是用于测试,可以试试这个:

如README所说的,这个脚本主要做2件事:

  1. 创建注册表项
    • 允许未授权使用时间从20分钟调整至1天
    • 禁用许可证获取通知
  2. 创建定时任务
    • 每天凌晨3点重启vGPU驱动

在实际使用中发现有一个问题:因为是重启驱动,所以会导致使用GPU渲染的软件崩溃或黑屏,首当其冲的就是浏览器。除此之外一切正常。

至此,所有工作均已完成。

0x06 结语

图形性能稍有提升,但图像质量的提升会给RD网关或直连的网络带来压力,对延迟的要求也有所提升。