AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

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:031416

评论

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

获5项大奖,发布《云计算开放应用架构标准》,阿里云持续领航云原生

阿里巴巴中间件

云计算 最佳实践 云原生 案例 白皮书

Golang最细节篇— struct{} 空结构体究竟是啥?

奇伢云存储

云存储 Go 语言

AI、智能健康与货币技术迎来大爆炸

容光

区块链 AI

列举出常见的Java面试题,我靠这个在春招拿到了阿里的offer

???

面试 Java面经 java真题分享

使用Docker运行DataX定时全量备份关键数据表

白粥

DataX 数据表备份

盘点golang中的开发神器

捉虫大师

Go 语言

网络攻防学习笔记 Day28

穿过生命散发芬芳

5月日更 网络攻防

虚拟机如何实现synchronized

wzh

虚拟机 并发 synchronized Java EE

OKR 八问 —— 关于 OKR 的常见问题与思考

CODING DevOps

团队管理 DevOps OKR

5分钟速读之Rust权威指南(十二)

wzx

rust

发展农村数字普惠金融的问题及对策分析

CECBC

2021智能制造、智慧金融、智能安全有何发展趋势

容光

AI 金融

极光开发者周刊【No.0528】

极光JIGUANG

程序员 开发者 开发者工具

人生算法:找到可复制的最小内核

石云升

读书笔记 5月日更 人生算法

智慧金融发展-转述

容光

2021年CES十款智能家居黑科技产品

容光

人工智能

100W点击 10w人获取,阿里Java高级面试题及答案 到底有多强

???

面试 java真题分享

云原生加速落地,金融行业应用上云来打样儿

BoCloud博云

云原生

🔎【Java 源码探索】深入浅出的分析ThreadLocal

洛神灬殇

Java 多线程 ThreadLocal 5月日更 ThreadLocalMap

【得物技术】得物App分发平台的探索建设历程

得物技术

效率 平台 实践 心路历程 迭代

从 Object.assign 开始了解ES2015

devpoint

浅拷贝和深拷贝 ECMAScript 6 assign

AI年中钜惠来袭—全场低至6折 企业新客1元优享福利翻倍

百度大脑

福利 Iphone12

python脚本编写——自动剪切移动文件夹

YUKI0506

全国首创“区块链+信用”平台即将上线

CECBC

2021北京人工智能展览会-转述

容光

智能IP先锋:从园区网络智能变革,到数字化转型新突破

脑极体

日志收集组件—Flume、Logstash、Filebeat对比

数据社

大数据 5月日更

运营管理

Qien Z.

5月日更

区块链与数字化转型的关系

CECBC

专家谈 AI:2021 年人工智能发展趋势(下)

容光

Go 并发编程-channel 连接一切

Rayjun

Go 语言

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