​桔妹导读: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 开源软件中心虚拟化组,具备丰富的底层系统软件开发经验。

延伸阅读 http://mp.weixin.qq.com/s?__biz=MzU1ODEzNjI2NA==&mid=2247496570&idx=1&sn=a11ff747ce40d3aa1ccc5667b5767f21&chksm=fc299dddcb5e14cb9061c1e62688607d55bd5ef9f271a4986cd938ff0d039676eed1470a53a8&scene=21#wechat_redirect

http://mp.weixin.qq.com/s?__biz=MzU1ODEzNjI2NA==&mid=2247487159&idx=1&sn=49c915854e9e32cfb02f20e6874fcc6e&chksm=fc2a6010cb5de906c0a1bbf6b8d16fef1d79003e8817db057beca584d795296cba8d879f9e65&scene=21#wechat_redirect

http://mp.weixin.qq.com/s?__biz=MzU1ODEzNjI2NA==&mid=2247495351&idx=1&sn=67c408c13e0ce25dea495d8492d87568&chksm=fc298010cb5e090681b6f027c387e6ad934eeedc400a5091c32e14ac740b66f1886b01876782&scene=21#wechat_redirect

内容编辑 | Charlotte 联系我们 | DiDiTech@didiglobal.com

滴滴技术 出品

vm虚拟机修改物理时间_GPU虚拟机创建时间深度优化相关推荐

  1. 虚拟机修改服务器mac地址,虚拟机修改服务器mac地址

    虚拟机修改服务器mac地址 内容精选 换一换 源端服务器数据收集声明.源端服务器上安装和配置完迁移Agent后,迁移Agent会把源端服务器信息发送给主机迁移服务校验,收集的源端服务器的详细信息请参见 ...

  2. HTML 修改时间日期,文件属性创建时间修改时间

    文件的创建时间.修改时间,访问时间是什么意思? 怎样把文件属性里的日期和修改时间改变 怎样把文件属性里的日期和修改时间改变 修改 属性里的 创建日期和 创建把文件属性里的日期和修改时间改变的具体操作步 ...

  3. mysql数据库创建 时间,[mysql]设置创建时间为当前时间

    SQL关键词 要注意大小写 --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER TABLE `table_name` ADD COLUMN `CreateTim ...

  4. 更改c语言程序保存地址吗,(C语言)修改文件时间程序(创建时间、修改时间、访问时间)...

    背景 在某些情况下,我们需要对文件时间进行修改,在这里主要和大家分享一下修改文件创建时间.修改时间和访问时间的程序,C语言编写. 解决方案 我们主要调用Windows API,直接修改文件时间为自己任 ...

  5. linux 修改文件日期,Linux 怎么修改系统和文件的创建时间和最终修改时间

    date -s 05/06/2013修改年月日为2013年5月6日, date -s 09:30:00设置系统时间为09:30:00, clock显示的为CMOS记录的时间,如果要以date的时间为准 ...

  6. linux进程创建时间,linux进程创建时间计算

    欢迎访问小站,阅读此文http://www.yandong.org/archives/501 简介 墙上时间,也就是距离1970年1月1日的时间,在linux kernel内部没多大用处,对其的应用多 ...

  7. c/c++ 修改文件的创建时间,修改时间,访问时间 [和弦]

    一直想抽点时间将 c/c++ 系统的学学,毕竟c/c++有时候在会比较方便些,c#写多了,也想换换语言使使,开阔下视野,使自己看问题能更宏观些,做项目的时候也会有更多选择.于是就想记点笔记,以便复习, ...

  8. linux下文件的创建时间、访问时间、修改时间和改变时间

    确切的说不存在创建时间.若文件从创建后不曾修改过则可认为创建时间=修改时间,若文件创建后状态也不曾改变过则可认为创建时间=改变时间,若文件创建后不曾被读取过则可认为创建时间=访问时间.但是,但是,上述 ...

  9. 批量修改 Word 、Excel、PPT 文档中的标题、作者、版本号、公司、创建时间等元数据

    概要:「我的ABC软件工具箱」提供了强大的修改 Office 文档元数据的功能,包括常见的作者.版本号.公司.创建时间.修改时间等这些信息.支持的文档格式有 Word .Excel.PPT,既能够对原 ...

  10. 如何修改文件的 “创建时间” 和 “修改时间” (macOS, Linux, Windows) 2023 修正版

    如何修改文件的 "创建时间" 和 "修改时间" (macOS, Linux, Windows) 2023 修正版 请访问原文链接:https://sysin.o ...

最新文章

  1. 从当前日期算起,获取几天前的日期和几个月前的日期
  2. swagger2 集成无效_Springboot2 集成Swagger2,解决配置完成后不显示的坑
  3. html5后代选择符,css选择符有哪些?哪些属性可以继承?
  4. 程序运行依赖的重要文件版本不对_Deno核心模块:灵活依赖amp;安全沙箱
  5. WebView性能优化--独立进程
  6. JAVA怎么实现网页退出系统_java后台实现js关闭本页面,父页面指定跳转或刷新操作...
  7. 使用DataGrip连接Hive
  8. Oracle DBA的SQL编写技能提升宝典(含SQL资源)
  9. MySQL和PostgreSQL在多表连接算法上的差异
  10. Java 设计模式 -- 代理模式
  11. win11玩游戏怎么样 windows11玩游戏的具体性能介绍
  12. PHP实现今天是星期几的几种写法
  13. 操作系统核心原理-4.线程原理(上):线程基础与线程同步
  14. Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
  15. 004-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-共享服务中心建设原则...
  16. Linux内核编程四部曲
  17. “Network”游戏棋人机对弈的设计与实现(二)—判断步骤是否合法
  18. Windows 中的 UAC 用户账户控制
  19. Python读取文本内容
  20. 【Spark重点难点】你从未深入理解的RDD和关键角色

热门文章

  1. C# System.Drawing.SystemColors 系统颜色
  2. cpu 之二 酷睿i3/i5/i7处理器到底简单区别
  3. 《Oracle从入门到精通》
  4. C# 第三方控件 错误 LC-1
  5. 九位名人美到极致的句子。读这样的句子,是一种享受。
  6. 邮件服务器最常见的安全问题及解决办法
  7. MyEclipse配色
  8. docker compose入门
  9. Spring Boot 中实现定时任务的常用方式--Quartz
  10. 全面理解ThreadLocal