挂牌玄机彩图

您的当前位置: 香港挂牌 > 挂牌玄机彩图 >

浅谈GPU虚拟化技术(四)- GPU分片虚拟化

发布日期:2019-08-20

  对于“分片”的理解,相信大家已经不陌生了。此处的分片从两个维度上来定义:其一,是对GPU在时间片段上的划分,与CPU的进程调度类似,一个物理GPU的计算engine在几个vGPU之间共享,而调度时间片一般都在1ms-10ms左右,其二,是对GPU资源的划分,主要是指对GPU显存的划分,以NVIDIA为例,一个物理GPU带有16GB的显存,那么按照16个vGPU来划分,每个vGPU得到1GB的显存。由于安全隔离的要求,每个vGPU独享分配给它的显存,不会与其他vGPU共享。

  那么什么叫mediated passthrough呢? 它与pass through的区别是什么呢? 一句话解释:把会影响性能的访问直接passthrough给虚拟机,把性能无关,功能性的MMIO访问做拦截并在mdev模块内做模拟。太过细节的东西详见后续篇章。

  当然光有内核的支持还不够,需要加上qemu v2.0 以后版本,加上Intel或者NVIDIA自带的GPU mdev驱动(也就是对GPU MMIO访问的模拟),那么GPU分片虚拟化的整个路径就全了。而GPU厂家的mdev驱动是否开源取决于自己。按照一贯的作风,Intel开源了其绝大部分代码,包括最新的基于mdev的GPU热迁移技术,而NVIDIA也保持其一贯作风:不公开。

  说起GVT-g我大概可以讲上三天三夜。当然大伙这儿也未必想听。捡简洁的说起:

  我们可以在任何一个带集成显卡Intel SKL/BDW的机器上运行GVT-g虚拟化的方案。GVT-g的GPU虚拟化方案也被用到了嵌入式,车载系统等领域(ARCN hypervisor)。

  干货来了J 对于想了解GPU的运作,以及软硬件规范的,Intel其实已经开源了其大部分标准。

  截个屏,对于想了解GPU内部部分设计与运行机制的人来说,光看看这个列表就会莫名的兴奋。

  又同时GVT-g完全免费,用户不需要花费额外的费用来支持vGPU的应用。

  也正是这些优点,使得GVT-g可以被广泛的运用到任何对终端有虚拟化与显示要求的场景。比如XenClient,比如ARCN等等。

  GVT-g在内部虚拟了一个类似display pipeline的组件,来接管GPU display port上连接的显示器。所以vGPU内部framebuffer的信息可以被GVT-g快速的显示在物理GPU连接的显示器上。其显示FPS可以到达惊人的60FPS。完全达到了物理显示器的效果。更为强悍的是,vGPU通过对这些port和EDID的模拟可以在虚拟机内部支持多屏显示,其显示效果达到了完全与物理机状态下难分难解的地步。

  其framebuffer的传输路径可谓九曲十八弯…但效果还不错。60fps妥妥的。

  内嵌一段视频,来描述两个VM是如何共享同一个物理显示器,并能做到流畅切换:

  随后由于Intel GPU软硬件设计人员在下一代GPU中的设计没有全面考虑分片虚拟化场景,在一定程度上破坏了GVT-g在media transcoding上面的优势。目前在BDW和SKL上面的vGPU编解码效率已经不尽人意,失去了其优势。

  vGPU基本上对于Graphic rendering的能力是物理GPU的80%以上,一般在90%左右,回忆一下我们在第三章中介绍的AMD的SRIOV类型GPU虚拟化下vGPU的渲染能力可以达到97%左右。同时本身Intel GPU物理渲染能力与AMD/NVIDIA的同时代GPU比较也远远处于下风。所以对于强调大计算力的3D渲染场景的vGPU应用,Intel GPU的应用比较受限。

  从技术的角度来看,GVT-g对于vGPU的性能损耗主要开销在于对其中断相关MMIO的模拟。比如对于AMD的SRIOV方案,其VM中对vGPU的MMIO访问完全没有虚拟化开销,不会有trap发生。即便不采用SRIOV方案,一般来说,硬件设计很多时候会考虑到对虚拟化的要求,并做出有利于虚拟化框架的改动。类似这种中断相关对性能敏感的MMIO是需要特殊设计以减少在虚拟化下的损耗。而像Intel GPU这样完全不考虑虚拟化开销的硬件设计,使得GVT-g在软件层面无论如何优化都无法达到潜在对手的高度。为什么说是潜在对手呢?因为对于NVIDIA来说,GVT-g与Intel GPU根本就算不上是一个对手。

  GVT-g的vGPU在软件层次做到了极致。其早在2015年末就开始了对vGPU的热迁移支持。并在2016年对外公布。而GRID vGPU只在最近才有消息透露其在Citrix的某些产品上支持vGPU的热迁移,并只支持部分GPU型号。而AMD的SRIOV方案至今没有热迁移方面的公开消息。

  vGPU的热迁移细节太过技术化,此处不多做介绍,但是当年第一个支持vGPU的VM渲染实时迁移的效果还是让人印象深刻的。其视频是基于KVM的vGPU迁移过程。

  从视频截图中可以看出,其所有迁移过程在小于1秒的时间内完成并显示在新机器上了。(Demo的实际整体迁移时间为300ms左右)

  实话说GVT-g的调度并没有AMD SRIOV vGPU做的好。其调度粒度虽然是在1ms时间片的维度上做调度和vGPU切换。但是由于GPU软硬件对preempt功能的支持尚未完备,实际调度往往需要等当前vGPU的任务结束才能开始。在渲染大帧的情况下vGPU调度信息一般的统计显示,其基本上在5-10ms左右的间隔做vGPU切换。回忆一下AMD的SRIOV是严格6ms一次。而NVIDIA的GRID vGPU有多种调度策略,由于闭源,没有更多的信息可以拿到其调度信息。有心得读者可以在虚拟机下通过rebuild NVIDIA Guest Linux驱动研究一下。

  当然悲催的是,也正是由于GVT-g是基于Intel的集成显卡,即便是免费附加增值服务,GVT-g在数据中心也很少被采用。第一本身的GPU性能无法与AMD/NVIDIA同类产品竞争,第二数据中心追求的是高密度运用,集成显卡无论如何都无法做到一机多卡的情况,在机房机架,寸土寸金的地方,大家都会考虑成本。Intel也作过一些尝试,把几个Xeon E3的CPU做到一块PCIE板卡上面增加其计算密度,然而其功耗和售价都无法与其他对手竞争。同时这种设计也使得软件系统复杂难维护。

  闭源系统,没什么好介绍的。值得一提的是NVIDIA GRID vGPU是正式商用的方案。其技术在VMWare,XenServer,Redhat等大厂已经久经考验。

  虽然没有多少人会在一个分片GPU虚拟化的VM内部作深度学习计算,但GRID vGPU的计算性能也已经可以达到其passthrough状态下的80%以上。其目前vGPU 1:1分片(一个物理GPU只分一个vGPU)情况下,各项性能指标几乎已经与passthrough GPU的方案不相上下。完全可以取代GPU passthrough的方案。但对多vGPU的支持,目前GRID vGPU无法支持。这是其对比GPU passthrough方案最大的弊端。NVIDIA显然不会坐视不理,GRID vGPU将来一定会考虑多vGPU的场景并支持P2P。GRID vGPU另外一个对比passthrough GPU的好处就是可以在Host端对vGPU关键性能指标的监控。还记得我们在本系列第二章介绍GPU passthrough方案的时候提到的:GPU passthrough方法的固有缺点吗?GPU passthrough情况下host端对vGPU无法进行有效监控,而这在GRID vGPU的场景下完全不成问题。

  GRID vGPU分片虚拟化的方案相对GPU passthrough来说部署比较困难,由于闭源,其并不像Intel GVT-g一样一切开源并整合到kernel代码库中,一般厂商需要使用该技术还得作不同程度的kernel适配和调试。发布周期至少半年以上。

  而GPU passthrough方式下,vGPU的cmd直接由虚拟机内部提交。无需再绕道Host端。由此 passthrough下,无法对虚拟机内部vGPU的运作做出监控。

  分片虚拟化不需要IOMMU硬件的支持。其只需要VFIO模块添加type1 IOMMU的驱动,来通知host将要进行的DMA传输的GFN,数码挂牌一句真言四来八来。VA等信息,并在Host端的mdev设备驱动层完成GFN到PFN的翻译处理。可以理解为软件层面上的IOMMU操作。

  至此,“浅谈GPU虚拟化技术“系列文章完结。谢谢大家拜读。尽情等待未来“深入GPU虚拟化技术“系列….哈