共计 3402 个字符,预计需要花费 9 分钟才能阅读完成。
简介: 阿里云工程师李伟男和郭成在 KVM Forum 2020 上具体介绍了阿里云 KVM 虚拟机创立及启动工夫优化的具体技术实现,本文依据其演讲整顿而成。
对于云计算用户来说,过长的 KVM 虚拟机创立及启动工夫十分影响体验,特地是超大规格的 KVM 异构虚拟机。以 350G 内存为例,创立工夫须要 2 分钟,当用户此时创立虚拟机是用于疾速复原业务时,2 分钟的创立等待时间齐全超出用户的可忍受值。另外,对于云计算的后盾管控零碎而言,过长的阻塞工夫极大地影响了系统调度效率。
始终以来,阿里云异构计算团队在 KVM 性能优化方面都有大量的投入,积淀了大量实战经验。阿里云异构计算团队创新性地提出了一种显著优化带有透传(pass-through)设施的 KVM 虚拟机创立及启动工夫的办法,虚拟机的启动工夫不再随着分配内存的大小而显著减少,即便虚拟机被调配了几百 G 甚至更多的内存,用户感知的启动工夫仍然没有明显增加。
在这套技术优化计划下,对于 350G 内存的虚拟机,创立及启动工夫可从原来的 120 秒以上升高到 20 秒以内,效率整整晋升了 6 倍以上;对于 T 级内存的虚拟机,预计创立效率能够晋升 10 倍以上。
作为 KVM 社区最为重要和权威的大会,KVM Forum 2020 有 3 个议题是与 KVM 虚拟机创立及启动速度的优化无关,别离来自阿里巴巴、英特尔和滴滴,可见 KVM 社区及云计算业界对此问题的器重水平。阿里云工程师李伟男和郭成在 KVM Forum 2020 上具体介绍了阿里云 KVM 虚拟机创立及启动工夫优化的具体技术实现,本文依据其演讲整顿而成。
1、发现问题:内存越大、启动越慢,DMA map 执行是耗时小户
家喻户晓,PCI 设施透传是 KVM 虚拟化利用中一个十分重要的场景,而 VFIO 是以后最为风行的 PCI 设施透传解决方案,为了可能在应用层提供高效的 DMA 拜访,在启用 VFIO 设施之前,须要将调配给虚拟机的所有内存都锁定并进行 IOMMU 页表的创立。
这么做的起因在于,DMA 拜访可能笼罩整个虚拟机的内存空间,并且 DMA 拜访的内存不能被换出(swap)。所以,如果可能在物理设施 DMA 拜访之前得悉将要拜访的地址空间,就能够在运行中进行内存锁定(pin)及 IOMMU 页表的创立。但目前并没有一个简略、高效的办法可能实现这一操作。为了虚拟机及设施的高效运行,目前开源社区采取的方法是在虚拟机创立时将所有调配给它的内存进行锁定并创立 IOMMU 页表(DMA map)。
因为 DMA map 是一个绝对比拟耗时的操作,在虚拟机内存绝对较小时,总体耗时是能够承受的。但随着虚拟化市场及技术的倒退,越来越多的用户开始应用超大规格的虚拟机,内存资源已从 4G 增长到 384G 甚至更高,随之带来的 DMA map 工夫耗费问题也日益突出。
图 1: 虚拟机的创立及启动工夫与内存大小关系
如图 1 所示,以开源社区的 KVM 虚拟化组件及 Ubuntu18.04 虚拟机为例,在虚拟机内存达到 350G 以上时,整个 KVM 零碎的启动工夫将超过 2 分钟,其中绝大部分工夫都耗费在 DMA map 执行操作中。在这 2 分钟里,对于用户来说虚拟机是一个黑盒,用户能做的只有静静期待,甚至不确定虚拟机是否依然在失常创立中,齐全处于未知的状态。
2、设计思路:异步 DMA map,完满解决虚拟机创立耗时问题
为了解决这一个问题,阿里云异构计算团队钻研了现有的虚拟化技术和理论利用场景。尽管 DMA map 自身不能省去,但咱们发现在系统启动过程中 DMA 拜访尽管是随机的、但并不会拜访到全副,由此阿里云异构计算团队提出了一种异步 DMA map(async DMA map)的办法,即在虚拟机创立过程中仅 map 无限的内存空间,残余的大部分内存空间能够在虚拟机启动过程中于后盾异步 map 实现,从而保障用户能够疾速地获取拜访虚拟机的权限。
这时,如何保障虚拟机在启动过程中不会有设施通过 DMA 拜访到须要异步 map 的内存就成为了要害。这个过程中,咱们用到了大家比拟相熟的 Virtio-balloon,因为 Virtio-balloon 设计之初即被用来占用虚拟机内存应用,因而咱们提出的解决方案不会波及到大量、简单的软件改变,即可完满解决虚拟机创立耗时的问题。
图 2:async DMA map 设计思路
Async DMA map 次要设计思路就是:虚拟机创立时,低于 4G 内存空间的 DMA map 申请会被失常解决,其余内存空间的 DMA map 操作将会期待 virtio_balloon 前端驱动加载实现后依据理论状况进行解决。
具体的操作流程如下:
首先,确保 virtio_balloon 驱动先于 VFIO 设施驱动加载。这样 virtio_balloon 驱动会在配置空间中获取初始的 balloon 大小,而后再依据 balloon 大小进行理论的虚拟机内存的调配,被调配的内存将从可用内存中去除。在没有开释前,其余设施将无奈申请到这部分被占用的内存,那就不会被 DMA 拜访到,也就不须要在这之前进行 map。
其次,实现 balloon,取得可异步执行 map 内存空间。Balloon 的过程是通过很屡次 inflate 操作实现的。每次操作实现后,前端的 virtio_balloon 会告诉后端实现的 inflate balloon 大小及其对应的 PFN,位于宿主机上的后端驱动收到告诉后,会将 PFN 从音讯队列中解析进去,并转换为 IOVA 记录在 ballooned 页表中。待 balloon 实现后,后端驱动会失去一张残缺的被 virtio_balloon 占用的内存页表,这部分的内存空间即是能够异步执行 map 的局部。没有在页表中的内存可能会被其余设施通过 DMA 拜访,因而须要即刻实现 map 操作。
最初,在保障虚拟机零碎可持续失常启动的状况下,async DMA map 正式开始。通过向 virtio_balloon 前端驱动触发 deflate 操作,从而向虚拟机偿还肯定大小的内存,前端 virtio_balloon 驱动会将开释的内存地址同步给后端驱动,后端驱动接管到被开释的内存地址空间后,触发同步的 DMA map,通过分步的 deflate 及 map,缓缓实现全副内存的映射、锁定,从而使虚拟机复原到残缺内存资源可用状态。
- 具体实际:三个关键点优化,进一步优化启动工夫
==========================
在具体的实际中,咱们进行了 balloon 邻近地址空间主动合并、减少单次 balloon 页面大小和预处理机制等三个关键点的优化,以进一步优化启动工夫。具体优化如下:
(1)Balloon 邻近地址空间主动合并。通过合并屡次 balloon 的邻近内存地址空间,能够显著地缩小触发 DMA map 的次数。因为 virtio_balloon 会在系统启动初期被加载,此时的内存应用较少,virtio_balloon 申请到的内存地址绝大部分是间断的,邻近内存地址的可合并率十分高。
(2)减少单次 balloon 页面大小。内存资源曾经不再是十分稀缺的资源,以后 virtio_balloon 前端驱动中基于小页(4KB)大小的内存申请机制曾经不太适宜以后大规格实例的业务场景。基于业界用户理论利用场景的剖析,咱们将 virtio_balloon 单次申请的内存大小从 4KB 进步到 2MB,这一动作可缩小约 98% 的前后端通信耗费,从而显著缩小了不必要的 CPU 资源占用。
(3)预处理机制。为了更快的实现异步 DMA map 操作,其实能够事后开始进行 DMA map 操作,而不是期待 deflate 触发并收到 virtio_balloon 前端驱动收回的告诉才进行。在接管到前端收回的告诉后,只须要做开释地址已映射命中检测即可。如地址未命中则能够插入 DMA map 操作,若命中则能够更快地返回告诉给虚拟机进行后续的 deflate 操作。
图 3:VM 启动工夫与内存关系(左)、QEMu 初始化工夫与内存关系(右)
如图 3,通过上述的优化(初始保留 8G 内存给虚拟机),咱们看到随着调配给虚拟机的内存减少,KVM 虚拟机的启动工夫及 QEMU 初始化工夫均没有明显增加。即咱们将 350G 内存 KVM 虚拟机的创立及启动工夫从原来的 120 秒以上缩小到 20 秒以下,QEMU 初始化工夫缩减到 7 秒以内。对于 T 级内存的用户,预计效率可晋升 10 倍以上,能够极快地取得虚拟机的访问控制权限。
结语
将来,咱们将继续依靠阿里云智能,致力于云计算产品的性能及用户体验的优化,为用户提供便捷、高效的弹性计算产品。
原文链接
本文为阿里云原创内容,未经容许不得转载。