Page 49 - 《软件学报》2020年第10期
P. 49
李鼎基 等:基于跨虚拟机零下陷通信的加速器虚拟化框架 3025
3.1 基于虚拟机的被动式服务端
Wormhole 的设计选择了一种基于虚拟机的被动式服务端(passive server VM)模式,相较于现有的交互模
式,有着性能以及灵活性方面的优势.所谓被动式服务端,就是服务端虚拟机在没有待处理的用户请求时不会主
动占用任何 CPU 资源.
在本文的设计中,所有加速器会通过 PCI 直通的方式透传给专门用于管理的服务端虚拟机,从而实现加速
器管理与主机操作系统解耦.服务端虚拟机在初始化阶段与一个普通的客户虚拟机别无二致,也可以拥有自己
的 CPU,如图 4(a)所示,此时的服务端虚拟机独占 1 号 CPU,正在准备所需的通信接收模块等运行环境.在所有预
先配置任务完成之后,服务端虚拟机会主动陷入类似快照的冻结状态,如图 4(b)所示,此时的服务端虚拟机已经
不再拥有 CPU 资源,其原有的 1 号 CPU 资源可以被释放给其他的客户端虚拟机使用,这样就消除了不断等待客
户端虚拟机的请求造成的服务端 CPU 资源浪费.
根据测试数据可知,现有加速器虚拟化方案的通信模块花费了大量时间在互相等待对方,例如服务端 CPU
在运行后端驱动程序等逻辑时,客户端 CPU 在结果返回之前一直处于空闲状态.因此在 Wormhole 中,完全可以
利用发送完请求的客户端 CPU 在服务端虚拟机中代理执行来消除 CPU 资源的浪费,使得被动式的服务端虚拟
机变得可行.本设计提高了虚拟化后的 CPU 使用效率,节约下来的 CPU 资源可以分配给更多的客户虚拟机使
用,解决了第 2.2 节中提到的问题.
在同一个物理服务器上可以同时存在多个被动式服务端虚拟机,每个服务端虚拟机可以被分配到不同数
量的加速器中.同时,得益于虚拟机的隔离,不同的服务端虚拟机可以安装不同版本的加速器驱动程序以及配套
的计算库等,以适配不同用户的需要,这也意味着,如果物理服务器上接入了多种异构加速器,不同的加速器也
可以经由不同的服务端虚拟机进行隔离,不会出现互相干扰的情况.本设计使得虚拟化框架能够非常容易地接
纳快速更迭的不同种类加速器,解决了第 2.1 节中提到的问题.
3.2 基于控制流切换的主动式跨虚拟机通信
由于 Wormhole 的被动式服务端释放了自己的 CPU 资源,虚拟机间的通信必须由客户端采取主动式通信的
方式配合服务端,因此本文提出了代理执行的方法,允许客户端执行流主动地进入服务端虚拟机继续执行.为了
能够确保代理执行的正确性,要求 CPU 在不同虚拟机中运行时处于正确的地址空间中并能够访问到正确的指
令和数据.在此基础上,必须进一步解决第 2.2 节中提到的性能问题才能达到 Wormhole 的高性能目标.因为虚拟
化额外开销与下陷的次数紧密相关 [26] ,为了获得优异的跨虚拟机通信性能,本文通过预先配置实现了控制流切
换过程中的零虚拟机下陷.
本小节将以图 4 中一次代理执行的流程为例介绍本设计的核心思想,在图 4(b)中服务端虚拟机在初始化完
毕后向虚拟机监视器注册了自己的服务端信息,之后,客户端虚拟机被允许在该服务端虚拟机中代理执行,在图
4(c)中客户端虚拟机首先进行了一系列控制流切换前的准备工作,准备完成后切换执行流进入服务端虚拟机,
实现了如图 4(d)所示的代理执行.得益于本文的设计,图 4(c)和图 4(d)中与控制流切换相关的操作均会在非特权
模式中完成,从而不会触发任何虚拟机下陷.一次完整的代理执行流程的调用可以被划分为 6 个步骤.
首先,客户端虚拟机发起与服务端虚拟机配对的请求,会下陷到虚拟机监视器中添加一些内存映射.下列①
~③步属于一次性的预先配置,这一阶段虽然会主动触发虚拟机下陷,但是并不在跨虚拟机通信的关键路径上,
后续的代理执行不需要重复这些操作,配置完成之后的控制流切换过程会保持零下陷.
① 虚拟机监视器会在服务端虚拟机的扩展页表中,将客户端进程 CR3 的值映射到服务端进程页表的
HPA.本步骤的目的是为后续的 VMFUNC 指令实现虚拟机地址空间的正确切换做准备.对于虚拟机的二级地址
翻译机制而言,VMFUNC 指令的现有功能只有切换控制第 2 级地址翻译的扩展页表,而第 1 级地址翻译依靠客
户端进程 CR3 指向的页表,所以需要在 VMFUNC 指令的前后对应正确的页表以完成地址空间的变更.在本步
骤添加映射后,客户端进程 CR3 的值可以在客户端虚拟机的扩展页表中被翻译为客户端进程的页表内容,而同
样的值可以在服务端虚拟机的扩展页表中被翻译为服务端进程的页表内容,保证了 VMFUNC 指令前后地址空