桔妹导读:GPU虚拟机实例创立速度慢是私有云面临的广泛问题,因为通常状况下创立虚拟机属于低频操作而未引起业界的器重,理论生产中还是存在对GPU实例创立工夫有刻薄要求的业务场景。本文将介绍滴滴云在解决该问题时的思路、办法、并展现最终的优化成绩。

从私有云服务商那里购买过虚拟主机的资深用户,个别会发现这么个法则:创立一台CPU虚拟主机是比拟快的,然而要创立一台蕴含GPU卡的虚拟主机通常须要等比拟长的工夫,整个创立过程短则数十秒钟,长则数分钟。对于绝大多少的用户来说,虚拟主机的创立工夫长一点对他们影响并不大,因为创立虚拟机属于绝对低频操作。然而也会有一些特定的用户因为其业务场景交互性比拟强,会对虚拟主机的创立工夫有绝对刻薄的要求,因为过长的创立工夫会导致其业务用户体验很差。本文将从虚拟化的角度来介绍GPU虚拟主机创立工夫长背地的起因,以及相干的优化办法。

通过剖析Libvirt, QEMU以及Guest 内的相干日志及对应的工夫戳,能够获取GPU虚拟主机在创立过程中的耗时状况,这里咱们次要关怀几个要害的工夫点:  a) Libvirt 开始创立QEMU 过程;b) Libvirt 执行 Resume启动VCPU ;  c) Guest kernel 打印第一条日志.  在本文中,咱们把a和 b 之间的工夫距离称为QEMU初始化工夫, 把b 和c 之间的工夫距离称为 BIOS执行工夫。以下数据是在滴滴云的线上环境中采集到的创立一台蕴含8个CPU核虚拟机实例的相干数据:

从下面的数据能够看到,对于规格雷同的虚拟机实例,带1块P40卡的GPU实例相比同规格的CPU实例在QEMU初始化及BIOS执行局部的工夫都显著要长, 在带4块P40卡以及更大内存规格的场景下,须要的工夫会进一步拉长。通过试验咱们发现在主机配置和GPU卡型号确定的前提下,GPU实例的创立工夫长短次要取决于两个因素:虚拟机的内存大小和GPU卡的数量。

为什么GPU实例的创立过程要比CPU实例的创立过程耗时长?多耗费的工夫到底花在哪里?要搞清楚起因须要深刻的剖析,比拟直观的方法就是通过perf采样来生成火焰图,以此来剖析虚拟机在创立过程中的热点函数。下图是在滴滴云环境里抓取到的GPU虚拟机启动过程中QEMU过程的火焰图。

通过对代码调用关系的剖析,能够得悉热点产生在零碎分配内存和对内存页面清零的过程中,是由QEMU中的vfio_dma_map函数在执行VFIO_IOMMU_MAP_DMA  ioctl 零碎调用所触发,该调用会Pin住所有调配给VM当做RAM应用的内存。在Pin 内存的过程中,如果虚拟内存对应的物理页面尚未调配,会先进行物理内存调配并对内存页面内容进行清零。在Linux kernel 中,对调配给应用程序的内存进行清零次要是基于平安方面的思考,防止Host 内存中的内容透露给用户空间的应用程序。这里之所以要将内存Pin 住,目标是为了保障IOMMU IO页表和 host HVA->HPA 映射的一致性,否则Guest 内设施的DMA操作可能会拜访到谬误的内存页面。

VFIO DMA 映射解决慢能够在肯定水平上解释为什么内存的大小和GPU卡的数量会影响到GPU实例的创立工夫。虚拟机实例内存规格越大,须要映射和Pin住的内存量也就越大,相干解决的耗时和内存量成正比。另外GPU卡上通常会蕴含一块比拟大的MMIO区域,对MMIO的映射也会消耗较多的工夫,卡的数量越多,耗时就会越长。相比之下,CPU实例的创立过程没有VFIO DMA 映射的相干解决流程,因而会比拟快。

针对以上的热点,有什么方法能够打消或者缓解呢?曾经有业内的同行们提到过这个问题并给出了对应的解决方案,其思路是对调配给VM 用作RAM应用的内存区域做一个标记,在内核中跳过对标记的内存页面进行清零,而将清零的动作留给QEMU来做,在QEMU 中能够利用多线程以及更高效的指令进行清零动作,从而减速Pin内存的过程。该计划的缺点次要有两点:  一是存在安全性危险,其余应用程序能够利用设定的标记来窥探host 内存中的信息;二是在VM实例的VCPU个数比拟少的状况下,优化成果不是很好。

咱们采纳了另外一种计划,通过批改Host kernel的内存治理局部, 咱们实现了一种对Host 上闲暇物理内存提前进行清零的机制,清零动作能够在零碎闲暇的时候进行,当某个内存页面被清零后,将其对应的 struct page 进行标记,这样在须要对内存进行清零的时候,能够通过查看该标记来判断是否要执行清零动作,如果清零的标记曾经被设置,就能够跳过清零的步骤。该计划防止了上述计划中的两个次要问题,同时还有其它方面的益处,次要包含以下几点:a.能够进步缺页异样解决效率,尤其是通明大页的缺页异样解决效率;b. 能够减速须要Pin内存及须要通过mlock 来锁住内存的利用场景,例如应用RDMA, QAT 硬件加速等场合;c.  能够减速内核中其余须要对内存进行清零的场景。相干补丁的RFC版本,咱们曾经提交到了Linux kernel 社区。

另一个减速Pin内存的无效办法是采纳大页,通过开启通明大页能够显著缩小缺页解决的调用次数并减速Pin内存的过程。下图展现了开启通明大页以及启用闲暇内存预清零机制对GPU实例创创立工夫的影响。

以上的数据表明,在开启通明大页以及闲暇内存预清零性能后,能够显著的的优化QEMU的初始化工夫,然而BIOS局部的耗时仍然偏长。通过进一步的剖析咱们发现次要的工夫耗费还是在VFIO 映射DMA的处理过程当中,次要有几个方面的起因:a. 映射DMA Pin内存须要逐页查问页表,开销较大;b. QEMU 存在对局部IOVA区域的重复映射及解除映射的操作。于是咱们尝试在这两个方向上进行优化,通过采纳批量解决的办法缩小查问页表的开销,另外在QEMU中退出VFIO DMA映射区域的治理,无效的躲避了效率低下的重复映射及解除映射操作,最终大幅度降低了VFIO DMA映射的工夫耗费。

在解决完上述问题后咱们并没有止步,对虚拟机实例创立过程中的可优化的其它中央,咱们也做了相干的解决,例如敞开BIOS boot menu ,优化VFIO PCI 设施reset 的流程,去掉对GPU实例来说不必要的操作,最终将GPU实例创立过程中虚拟化局部的工夫开销缩小了90%以上,上面这张图展现了单卡小内存规格实例优化前后的耗时比照:

大内存规格和多GPU卡的成果更加显著,工夫缩小了95%以上,相干数据如下图:

通过上述的优化,目前在滴滴云上创立一个GPU实例的速度比优化前显著放慢,甚至比优化前创立一个CPU实例的速度还要快,如果用户对GPU实例的创立速度有比拟强的需要,欢送到滴滴云上进行体验。

团队介绍

滴滴云平台事业群滴滴内核团队致力于为公司各种业务提供底层系统软件撑持,负责公司线上服务器Linux操作系统内核的研发并保护虚拟化相干的外围组件。团队针对各个业务的需要,在虚拟化、业务混部、资源隔离、零碎性能优化等畛域均有宽泛深刻的钻研,在私有云、弹性云等业务线都有相干的产品。

作者介绍

专一于零碎虚拟化钻研,负责解决滴滴云底层虚拟化相干技术问题。曾就任于Intel 开源软件核心虚拟化组,具备丰盛的底层系统软件开发教训。

延长浏览

内容编辑 | Charlotte
分割咱们 | DiDiTech@didiglobal.com

滴滴技术 出品