QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

GPU 虚拟机创建时间深度优化

  • 2020-09-02
  • 本文字数:2626 字

    阅读完需:约 9 分钟

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 实例的创建速度有比较强的需求,欢迎到滴滴云上进行体验。 除此之外,滴滴云 GPU 产品现已开通企业 0 元体验,请在滴滴技术公众号后台回复「GPU」立即获取。


作者介绍


李亮,滴滴高级专家工程师


专注于系统虚拟化研究,负责解决滴滴云底层虚拟化相关技术问题。曾就职于 Intel 开源软件中心虚拟化组,具备丰富的底层系统软件开发经验。


本文转载自公众号滴滴技术(ID:didi_tech)。


原文链接


GPU虚拟机创建时间深度优化


2020-09-02 14:031489

评论

发布
暂无评论
发现更多内容

☕️【Java技术之旅】带你一起探究String类不可变的特性

码界西柚

string 原理 字符串 6月日更

程序员需要了解数据库知识么?

escray

学习 极客时间 朱赟的技术管理课 6月日更

从零开始学习3D可视化之模型动画

ThingJS数字孪生引擎

可视化 模型 大屏可视化 数字时代 3D可视化

《原则》(九)

Changing Lin

6月日更

宜兴牵手百度智能云共建人工智能应用中心,推动数字经济创新发展

百度大脑

人工智能

☕️【Java 技术之旅】带你一起攻克String类创建的难点分析

码界西柚

Java string pool string 6月日更

油管视频下载: 如何下载油管视频到本地

科技猫

分享 教程 经验 油管视频下载 下载油管视频

Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

360技术

2021年最新版Java后端最全面试攻略,全面对标BATJ

Java 程序员 架构 面试

带你剖析鸿蒙轻内核任务栈的源代码

华为云开发者联盟

鸿蒙 任务栈 任务调度 任务上下文

博云作为专业独立PaaS厂商,入选中国PaaS市场研究报告

BoCloud博云

PaaS

基于传感器的人体生命体征监控技术

不脱发的程序猿

物联网 传感器 智能医疗 人体生命体征监控技术

面试官:如何给字符串设计索引?

一个优秀的废人

MySQL 索引 字符串 索引优化

如何科学制定和管理项目计划?

万事ONES

项目管理 ONES 项目经理

阿里云官方出品:全面总结阿里云云原生架构方法论与实践经验

尹文敏

云计算 阿里云 云原生

我人生的里程碑之【作为独立开发者,第一次承接外包项目的心得经历,也许说出你的心声哦!】

码界西柚

程序人生 6月日更

开源之夏来啦,欢迎报名 Apache APISIX 项目!

API7.ai 技术团队

开源 后端 技术人生 API 网关

百度灵医智惠明星案例获人民日报点赞:智慧医疗让看病更便捷

百度大脑

人工智能 智慧医疗

用 CloudQuery 管理和操作数据库,更高效更安全

BinTools图尔兹

运维 dba 数据库管理工具

超全!阿里首发内部微服务架构笔记,再也不用为“微服务”苦恼了

Java架构师迁哥

centos7使用

xujiangniao

Linux

创业邦南立新:搭建创新生态,是奔向万亿美金市值的必经之路

创业邦

24道几乎必问的JVM面试题,我只会7道,你能答出几道?

北游学Java

Java 面试 JVM

毕昇JDK:为啥是ARM上超好用的JDK

华为云开发者联盟

Java 华为 jdk Openjdk 毕昇 JDK

建信金科大咖访谈:ISO20000及ISO27001标准体系解读

金科优源汇

在外包5年,每天读写删改,突然发现跳不出来了

Java架构师迁哥

如何针对美工与设计师的Maya工具进行版本控制

龙智—DevSecOps解决方案

准备3个月,面试10分钟,Java中高级岗面试为何越来越难?

Java架构师迁哥

福利时刻 十年黑客大佬的Web安全渗透技术分享

学神来啦

Linux 黑客 安全 运维自动化

Flink + Iceberg 在去哪儿的实时数仓实践

Apache Flink

flink

react源码解析9.diff算法

全栈潇晨

react源码

GPU虚拟机创建时间深度优化_安全_滴滴技术_InfoQ精选文章