专注虚拟化性能优化,硬件显卡网卡虚拟加速,面向容器的轻量虚拟化开发 永远的Linux Geeker!
分类: 虚拟化
2019-01-22 11:00:25
如今的显卡市场主要由AMD,Intel,Nvidia三家统治,然后Nvidia一家独大。尤其是N家提出的CUDA(Compute Unified Device Architecture)统一计算架构更是一骑绝尘,完全统治了GPGPU(计算为目的的GPU)市场。
目前GPU虚拟化并不能在所有的硬件里操作,正如DPDK对于网卡一样, 目前只有一些高端显卡才能实现。毕竟这是由它的需求客户场景所决定的,例如HPC,或者大数据计算,大规模数字图画3D处理,高并发的视频直播等。所以的这些实现都是百万元起步,这也决定了GPU虚拟化高端市场的定位。
本来GPU并不需要什么虚拟化实现,毕竟像HPC这样的场景,单纯的bare metal都不能达到它的计算要求,所以就更不需要虚拟化这层5%到10%的额外消耗,只是当前云计算的普及,几乎无人不知,而且虚拟机的运维管理便利更是让人垂涎不止,所以GPU虚拟化也被提上了日程,而最终在Linux 内核4.10被纳入了主流,进入了大众的视角。
当然在谈GPU虚拟化之前,还有两个阶段不得不提。
第一,传统的仿真VGA,通过QEMU 模拟出一些基本的VGA, 例如VGA,CIRRUS,QXL,SVGA 等等,基本上是通过宿主机的CPU来实现虚拟机的GPU,速度之慢可想而知了。我的另一篇文章(qemu中的新版vga仿真)也对此做了详细的说明。当然在这条道路上QEMU还是做出了非常大的进步,尤其是VIRTIO-GPU设备的实现,也让传统VGA具有了硬件加速一个数据计算的可能
然后就是 GPU 透传, GPU 作为一个传统的PCIE 设备,可以直接通过PCI Passthrough来传递给虚拟机使用。好处是显而易见的,实现简单,基本上只依赖当前的框架就可以实现,也不需要额外造轮子,而且性能也能达到95%-98%。不方便的就是独占性只能让一个设备在一个虚机里使用,毕竟我们不能在一个主机里加上几十甚至上百的显卡,这样太不符合虚拟化的运维便利性。
于是GPU 虚拟化真正被提出来了,宿主机里的一个物理显卡,通过虚拟管理层hypervisor来实现资源分割,然后划分成多个虚拟设备,然后再将这些虚拟设备透传给不同客户机。原理简单明了,但实现却复杂异常。目前来说主要有硬件实现以及软件实现两种。AMD使用的是硬件实现,也就是我们平常说的SRIOV, 而Intel以及Nvidia则限于版权问题,只能另辟新径,实现了一种软件的方法, mediated device platform(mdev). 而我们所说的内核4.10可以支持GPU虚拟化也是指对mdev的支持。而AMD虽然占有硬件实现的便利,一直也没有在主流内核中实现它的代码,目前只有一个非主线模块GIM (GPU-IOV Module)。
当然还有一点要提的就是,Nvida作为市场的老大,一直做的是闭源开发,我们只能通过他们提供的测试驱动包来实现,AMD虽然开源但是其$3000起步的硬件也让我们望而升怯,当然N家显卡也不便宜,但是贵在选择多,我会在另一篇文章里对硬件做一个详细介绍。所以,作为一个普通的码公,intel的集成显卡外加开源i915驱动实现最适合快速入门。
GPU虚拟化从4.10开始,如今也进入了内核5.0时代,基本功能已经非常稳定了,当然其资源调度核心一直是研究的重灾区,如果你想做点东西的话,这里永远适合你。再有就是匹配的虚拟化管理工具也跟上来了,比如你可以在libvirt xml配置文件中进行设置,管理便捷,而且三家显卡都推出了自己的 live migration的概念模型,相信很快就会在云开发环境中普及起来。甚至于GPU虚拟化在docker中应用也发展起来,相信在不久的将来,如CPU一样,GPU虚拟化也将会作为GPU的标配。我们期待这天的到来。
Enjoy, and have a lot of fun!