在最近的XenSummit 2016上,英特尔在一个Session上演示了基于XenGPU虚拟化在线迁移。为什么后起之秀会吊打老司机?


一、XenGT如何实现在线迁移?

我们先来看XenGT的架构

XenGT为什么会比GRID vGPU先实现基于vGPU的在线迁移呢?_英特尔

 

1、英特尔的显卡集成到CPU上,使用的显存是内存,和CPU共同访问内存空间;

2、hypervisor实现对GPU的陷阱(trap)和透传(pass-through)机制,说明意思呢?就是说和CPU虚拟化类似的思路,特权的指令交由hypervisor,这些指令有虚拟机传递下来后被拦截,交由hypervisor来模拟实现。至于透传机制,就是设备直通给虚拟机或者说是虚拟机直接访问硬件。

3、虚拟机能够直接访问GPU的东西是帧缓存和命令缓存,而所谓的特权资源是指I/O 寄存器和 PTEs。大家可以看我之前的文章《应用程序如何去访问硬件》,I/O 寄存器和 PTEs被虚拟化层拦截模拟,因此给带虚拟机的不是真实的GPU地址线和显存地址。

4、有了以上基础之后我们就好办了,只要我们的底层的显卡硬件规格相同,和CPU虚拟化类似,在进行虚拟机迁移的时候,到了别的物理主机,我们只需要拷贝映射的是特权资源(I/O 寄存器和 PTEs)。由于特权资源(I/O 寄存器和 PTEs)是虚拟的,所以到另外一台拷贝过去直接放入并链接到一块GOU显卡即可。

5、这种方式基于软件调度,虚拟机里看到的都是由hypervisor层模拟出的GPU,由hypervisor调度各guest虚拟机对的GPU行为,再统一对物理GPU进行访问操作。

 

二、NVIDIA GRID vGPU为什么很难实现在线迁移?

我们也来看看GRID vGPU的架构:

XenGT为什么会比GRID vGPU先实现基于vGPU的在线迁移呢?_虚拟机_02

 

1、在架构的实现上,GRID vGPU的实现是,在Dom0中运行一个vGPU的管理程序,他的作用是为了切片或者分区(Partitioning)

2、独立的硬件显卡上自带显存空间;

3、对于GPU的透传(pass-through)机制是通过硬件来实现的;

4、对于Timesharing/Oversubscription是通过硬件来实现的;

5、因此不管是帧缓存和命令缓存,还是特权资源(I/O 寄存器和 PTEs)都是在物理的硬件上,其虚拟机访问的显卡地址是真实的,由GRID vGPU分配。

6、所以这个东西都在硬件上,离开硬件就没法使用,因此没法在线迁移。

 

三、两家GPU虚拟化技术对比与总结

在这里总结一下vGPU研发技术演进,对于其中的一些细小的知识点不做过多的详细解读,大家可以参看之前的文章《GPU虚拟化技术》一文。

对于NVIDIAGPU虚拟化,其最初的时候和Citrix合作,根据IO虚拟化的实现工作机制,将GPU设备成功的通过IO Pass-Through的方式透传给虚拟机使用。后来可以在其上对物理设备进行切分,分别提供给多台虚拟机使用。按照CUDA开发的规划设计,未来的GPU虚拟化技术演进路线图如下所示:

XenGT为什么会比GRID vGPU先实现基于vGPU的在线迁移呢?_虚拟机_03

 

Pass-Through

Pass-Through的技术实现有多种方式,比如通过Intel VT-d技术将设备直接透传给虚拟机。总的来说,Pass-Through主要有两种实现形式:

  • Direct pass-through 顾名思义就是让VM 直接访问物理硬件,所以VM GPU 是一对一的关系,这样能提供完善的功能以及最好的性能,但是缺失了资源共享能力。

  • Mediated pass-through 也是VM直接访问物理硬件,但是并不是一对一的独占关系,而是访问专门给VM分配的一块区域。这种技术在中介特权(直接访问物理硬件)操作时能够访问性能临界资源,这种方案能满足良好性能、功能完善和优秀共享能力的需求。

Direct pass-through将一个物理GPU只分配给一个虚拟机使用,只有被分配使用权的客户虚拟机才能使用物理GPU,这种直接透传法分配方式保存了GPU 功能的完整性,在性能方面与真实系统环境下最为接近,并且还可以在虚拟环境中进行通用计算。但是,该方法无法满足虚拟机资源共享的设计要求,无法降低计算成本,除此之外,直接透传法的兼容性较差,仅能够使用于部分GPU 中。Xen VGA Passthrough利用英特尔公司的设备虚拟化(Intel VT-d)技术将主显示器暴露给某一个客户端虚拟机,这就导致其它的客户端虚拟机甚至宿主虚拟机都无法对其访问,失去了该GPU 的使用权。它在客户端虚拟机中实现了一些如 VGA BIOS、文本模式、IO 端口、内存映射、VESA 模式等显卡所具有的特殊细节,以此来支持直接访问的实现。

Mediated pass-through同样是将设备直通进入虚拟机,每个虚拟机被允许访问部分设备资源,而无需系统管理程序的干预,而特权操作是通过一个软件层进行调度或者代理的。Mediated这个单词在这里翻译为中介,中介的的直通扩展使用软件的方式来实现。它维持直接传递的性能,同时避免了通过 SR-IOV标准等增加了硬件的复杂性。因此,这种技术就需要GPU以及虚拟化软件共同来集成协作。

NVIDIAGPU虚拟化由第一种实现,即硬件实现;英特尔的GPU虚拟化由第二种实现,即软件实现。

最后还有一种技术:基于硬件调度的,SR-IOV标准里,定义了GPU除了可以有physical function(PF),还有virtual function(VF)hypervisorVF直接暴露给guestguest操作VF可以像操作真的GPU一样。AMDGPU虚拟化好像就是采用的这种技术实现,这种技术也是对硬件的要求和复杂度非常高,当然这种也没法在线迁移了。

Partitioning

Partitioning是一种将物理硬件进行切分的技术。这是最初在进行GPU虚拟化的过程中,在pass-through之后NVIDIA实现的技术,也就是GRID vGPU的技术,貌似是Kepler架构的实现。GRID vGPU是通过预先定义好的GPU-Group来进行切分的,用户在管理层面选择自己所需的GPU-Group来进行切分。当然英特尔就没有在物理显卡上实现。

XenGT为什么会比GRID vGPU先实现基于vGPU的在线迁移呢?_虚拟机_04

Timesharing/Oversubscription

这个技术我们可以理解为GPU的分时复用,就和CPU的分时复用是一样的,因此我就不用在详细介绍了。这个技术实现起来比较复杂,不管是基于软件的还是基于硬件的。

这个技术NVIDIA是基于硬件实现的,英特尔的是基于软件实现的。

 

LiveMigration

这个技术就是今天的说的了,英特尔在Xen上的XenGT已经实现,NVIDIA暂时还没看到,不过就纯技术角度来说,NVIDIA的这种硬件架构技术,如果需要实现在线迁移,实在难度不小,我猜测实现的思路有这几种:

1、借用SDN的思想,将特权资源(I/O 寄存器和 PTEs)和硬件分离;

2、借用RDMA实现,通过感知其他硬件的存在,迁移的时候通过复制特权资源而实现;

3、设置一个全局的特权资源池,特权资源在全局资源池内对所有硬件可视。