编者按:将物理设备通过 vfio 透传给虚拟机是虚拟化常用的技术,但当为虚拟机分配比较大的内存时,虚拟机的启动时间会明显变慢,可能由十几秒延长至数分钟,严重影响用户使用体验。本文整理自龙蜥大讲堂 51 期,浪潮信息操作系统研发工程师参与技术分享,介绍了设备透传虚拟机启动慢的原因及优化方法,以下为此次分享内容:
技术背景:大内存虚拟机设备透传启动延迟
虚拟机设备透传时存在问题,比如将网卡或者 GPU 这些 pci 设备通过宿主机的 vfio 透传到虚拟机,并且又为虚拟机分配了比较大的内存时,虚拟机的启动时间会明显变慢。特别是分配了几百 G,甚至上 TB 的内存时,就会有比较明显的启动延迟,可能由十几秒延迟到数分钟。由于只有第一次启动时,也就是 qemu 进程启动时才会影响,所以一般来说用户可以接受这个启动延迟,但如果用户有频繁创建销毁虚拟机的需求时就会有比较差的使用体验。
把设备透传到虚拟机内部之后将会使用虚拟机内部的驱动程序对设备进行操作,这里有一个重要的问题是在虚拟机内部该如何进行 DMA 操作,因为 DMA 是不会经过 CPU 的,所以使用的是物理地址,但虚拟机内部看到的物理地址实际上只是宿主机上 qemu 进程申请的虚拟地址,直接用来做 DMA 肯定是不行的。这里就需要借助 IOMMU 来实现,虚拟机内 DMA 访问的 GPA,经过 iommu 映射到宿主机上的物理地址 HPA2,另外虚拟机内的驱动程序也可以经过 MMU/EPT,把 GVA 映射为 HPA1,最终需要 HPA1 和 HPA2 这两个物理地址是同一个才能让设备正常运行。(如下图)
为了实现 HPA1 等于 HPA2,需要 GPA 到 HPA 的映射