东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

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

评论

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

“鲸鸿动能·品牌共创计划”发布,多项权益助力品牌激发无限潜能

最新动态

披荆斩棘的芒果 TV:基于 StarRocks 的云原生湖仓架构升级

StarRocks

Python 实训教学,更便捷的学生邀请及内容分发|ModelWhale 版本更新

ModelWhale

人工智能 数据分析 在线编程 高等教育 云课堂

​左手 Serverless,右手 AI,7 年躬身的古籍修复之路

阿里巴巴云原生

阿里云 Serverless 云原生

公链技术开发

西安链酷科技

区块链技术 区块链技术开发 公链开发 公链团队

代币发行出售私募平台技术开发公司

西安链酷科技

IDO代币预售

体育赛事直播平台源码解决方案,开发搭建系统架构的重要组成部分

软件开发-梦幻运营部

如何有效改进erp管理系统?erp管理系统改进建议方向

优秀

ERP管理系统

LeetCode题解:1486. 数组异或操作,模拟,JavaScript,详细注释

Lee Chen

Dapp开发技术团队 以太坊智能合约框架有哪些 区块链DAPP开发

西安链酷科技

DeFi质押挖矿 区块链开发

SQL和Python,哪个更容易自学?哪个更适合数据工作的编程新手?

高端章鱼哥

Python sql

数字货币双仓合约交易所系统开发搭建

V\TG【ch3nguang】

2023年10款好用的AI生成PPT软件盘点,干货建议收藏!

彭宏豪95

效率 软件 职场 PPT AIGC

语音识别技术:现状、挑战与未来发展

来自四九城儿

深入浅出了解华为云API网关的Gzip功能

华为云PaaS服务小智

云计算 软件开发 API 华为云

云桌面如何部署?云桌面系统方案部署详细教程

青椒云云电脑

云桌面 云桌面系统

ETL数据转换方式有哪些?

RestCloud

数据同步 ETL

Native SQLite Manager for mac(SQLite数据库管理器) 1.26.1全新激活版

mac

苹果mac Windows软件 Native SQLite Manager SQLite 数据库的工具

前端代码重复度检测

南城FE

JavaScript 前端 代码

邀你见证一本思维小册子的诞生:《豆哥宝典:思维模型》

豆哥

AI 思维模型 GPT 宝典

简单聊聊低代码

互联网工科生

低代码 数字化

基于Vue构建的快速开发框架

树上有只程序猿

Vue 低代码

什么是多云? 为什么我们需要多云可观测性 (Observability)?

NineData

多云服务 多云架构 多云管理 多云 多云多源

语音识别技术的优化与发展趋势

来自四九城儿

持续测试新范式:拨压测一体化

阿里巴巴云原生

阿里云 云原生 压测 拨测

Zilliz X Dify.AI ,快速打造知识库 AI 应用

Zilliz

大模型 Zilliz LLM zillizcloud

数字货币 加密货币开发公司 虚拟币发行

西安链酷科技

加密货币 数字货币钱包开发 IDO代币预售

回归营销初心,2023金投赏鲸鸿动能专场聚焦品牌重塑

最新动态

算启新程 智享未来,英特尔携中国移动为行业数字化转型提供新动能

E科讯

SRM供应商招采系统(源码)

金陵老街

低代码提速应用开发

这我可不懂

低代码

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