桌面虚拟化行业3D支持调研与整理

By | 2017年7月15日

本文不涉及技术细节内容,笔者尝试从普通用户视角可看到的产品或技术描述现阶段KVM虚拟化的3D支持应用变迁历程。

由于笔者经验有限,没有列举还请留言指出。

为了保证虚拟桌面中某些3D应用的正常运行,以及桌面3D程序的流畅度,虚拟化行业内会引入适用于远程显示协议(带内、带外)或者GPU(vGPU),但由于协议与vGPU的实现紧密相关,所以这里不会分开讨论。

早期阶段,有厂商使用了类似于VirtaulGL的技术,即将服务端的3D应用程序中的OpenGL相关指令交给客户端去执行(但一般运算仍然在服务端),相当于在客户端上实现native 3D显示效果。与之对应的协议为VNC,可适用于多个平台的客户端。一般应用场景是3D图站,且应用程序也运行在Linux/Unix中。

后来接触虚拟化以后,笔者感触最深的是VirtualBox的3D加速技术,使用效果尚可,可以支持较多大型3D程序。它依赖宿主机本身的3D处理能力外,也要求虚拟机内安装对应的驱动程序,以支持独有的虚拟显示设备,与之对应的带外协议一般为VNC。笔者之所以对VBox的感触深,是因为我看到了国内虚拟化厂商竟然有基于它实现的3D支持(四年前了,当时不明,所以觉厉)。这个不出意外,毕竟VBox开源,代码都有。但这个不算主流,笔者也不会对其进行深挖。

然后就是Citrix、VMWare、MS对应产品基于nVidia/AMD的硬件提供的vGPU,虚拟化厂商对其开发一般需要硬件厂商提供底层支持,对国内的厂商而言难度颇大。与之对应的协议也是自家虚拟化经典协议(比如ICA、PCoIP、RDP等)。

最后对应于KVM虚拟化中,做法颇多,但也继承于其他平台的路子。

1. GPU透传

这个做法较为普遍,技术上实现也最容易,但关键在于协议支持。一般带外协议不能很好地支持3D场景的变化,带宽、运算压力很大,所以工作点集中于自研带外/带内协议。就笔者知识所限,能看到的有基于流媒体的协议(早期云游戏)、CUDA远程调用(显示效果最佳)等。

2. vGPU(CPU提供)

对于这种方式来说,大家可能最熟悉的就是Spice协议了,它配合QXL设备能够很好地支持2D图显,但3D的支持仍然不佳,但是按照GPU的严格定义这也是个vGPU。另外,也有XQEMU这种专用的游戏模拟器值得借鉴。

3. vGPU(硬件GPU提供)

这个最早也是C家与N家的合作实现,配合C家的协议效果非常好,然而在KVM虚拟化中则迟迟没有实现(或许因为Linus老爷与N家关系不好)。但好在Intel在自家集显上做了工作,可以配合对应CPU虚拟出vGPU了,同时近期他们的工作也并入了Linux内核主分支。另外,N家从笔者入行以来就在说要支持KVM虚拟化vGPU,说到现在,直到去年他们受Intel的工作启发,讲了一个原型(详见尾端链接)才让人又看到点希望(也不要抱太大希望)。鉴于Intel在独显市场的试水,或许它在KVM vGPU会先于N家呢。(如果你是KVM开发人员,不要犹豫,买块M60在新内核上试试吧,去年那个PPT放出的时候社区已经验证了)
现在也有厂商基于KVMGT的原理,将普通显卡进行分割成多个vGPU提供给虚拟机,可以运行一些轻量级的3D程序或者游戏,但弱在传输协议,同时也不能运行过于繁重的应用(比如显卡杀手孤岛危机)。
除去采用特定型号的显卡提供专用vGPU外,QEMU在2.5版本也支持了普通显卡下即可工作的vGPU(Virgl),其普适性较高,但作为产品需较多验证,性能也不如专有硬件提供的好。
鉴于虚拟机内的独立GPU实现,现有的Spice协议已经完全不适用了,目前来说最快捷的就是RDP 8,自研更好。

至此,笔者只能整理出这些了,欢迎指正讨论。

相关链接:

VirtualGL: http://www.virtualgl.org
VirtualBox Source: https://www.virtualbox.org/wiki/Source_code_organization
Intel KVMGT: https://github.com/01org/gvt-linux/wiki/GVTg_Setup_Guide
Nvidia MDEV vGPU: http://www.linux-kvm.org/images/5/59/02×03-Neo_Jia_and_Kirti_Wankhede-vGPU_on_KVM-A_VFIO_based_Framework.pdf

发表评论

电子邮件地址不会被公开。