关于数据库:GPU虚拟机创建时间深度优化

52次阅读

共计 2975 个字符,预计需要花费 8 分钟才能阅读完成。


​桔妹导读: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

滴滴技术 出品

正文完
 0