云布道师
本期分享内容来自阿里云基础设施弹性计算团队发表在 OSDI 顶会的论文,OSDI 是 CCF 推荐的 A 类国际学术会议,Core Conference Ranking A 类会议,Impact score 4.79。OSDI 和 SOSP 是系统领域并驾齐驱的两个顶级会议之一。
本文作者介绍
阿里云基础设施事业部弹性计算虚拟化资源调度团队—陈梁
作者深耕工程与学术交叉领域,在国际顶级学术会议共发表 3 篇论文,并在实际工作中解决多个行业技术难题。
论文
To PRI or Not To PRI, That’s the question
论文作者
Yun Wang∗♠ Liang Chen*♢
Jie Ji♢ Xianting Tian♢ Ben Luo♢ Zhixiang Wei♠ Zhibai Huang♠ Kailiang Xu♠ Kaihuan Peng♢ Kaijie Guo♢ Ning Luo♢ Guangjian Wang♢ Shengdong Dai♢ Yibin Shen♢ Jiesheng Wu♢ Zhengwei Qi♠
♠Shanghai Jiao Tong University ♢Alibaba Group
背景介绍
在云计算环境中,虚拟化技术允许 CPU 和内存在多个用户之间共享,并且通过设备直通技术(SR-IOV)为用户提供了接近原生的 IO 性能。然而,这类技术存在局限:直通设备无法处理内存缺页,需要系统强制静态分配虚拟机使用的内存。这种静态内存分配的方式与云计算服务通过资源共享提升效率、降低成本的核心目标相悖。
2009 年,PCI 设备供应商联盟(PCI-SIG)在"内存地址转换系统"(ATS)规范中加入了 PRI (Page Request Interface) "。这项功能允许硬件设备在访问内存时,像普通程序一样触发内存缺页请求而非直接报错。其工作原理需要设备、内存管理模块和操作系统三方协作:当设备尝试访问不存在的内存时,系统会动态分配内存而非强制固定内存区域。
然而,这项技术的推广进程远不及预期。尽管早在 10 年前就已提出,但直到 2021 年英特尔在最新芯片组中才首次为内存管理模块添加了对这项功能的支持。目前,除了高端图形处理器外,大多数主流输入输出设备(如网络设备和存储设备)仍不支持该功能。此外,当前操作系统(如最新版 Linux)仅在特定内存管理模式下支持该技术,进一步限制了硬件兼容性。
现有工作
此前相关研究工作尝试在不依赖 PRI 技术的情况下解决虚拟机内存静态分配的问题,相关方案主要分为两类:
第一类是软件方案,包括(如 vIOMMU、coIOMMU、VProbe 和 IOGuard)。这类方法通常存在严重性能问题:它们会大幅降低系统运行速度,难以实际应用,且部分方案需要修改虚拟机软件代码。在云计算环境中,由于不同租户的虚拟机镜像存在较大差异,这类修改操作几乎不可行。
第二类方案则在硬件层面实现内存缺页处理(如 On-Demand Pageing 和 VPRI 技术)。这类方案将内存管理功能与硬件模块分离,理论上能提升效率。但现实应用中面临两大障碍:首先,它们仅能在高端或定制化硬件上运行,导致普通设备无法使用;其次,这类硬件方案会增加数据传输的延迟时间——就像在高速公路突然设置减速带,在高性能场景(如需要快速处理大量数据的任务)中降低整体效率。
洞察和挑战
当前硬件处理内存缺页的方式之所以效率低下,是因为它直接位于数据传输的核心路径上。与其被动等待设备报告内存缺页,不如在虚拟化管理层提前监控所有 I/O 请求。在物理设备访问内存前,主动处理所有潜在错误。这样一来,设备层面就不会出现内存缺页。我们方案的核心创新在于,用一套可控的软件处理流程替代了原有方案中不可预测的硬件处理流程,前者成本更低且更稳定,而后者可能因延迟导致系统崩溃。
可行性分析
- DMA 请求监控点 VirtIO 作为通用虚拟设备标准,在虚拟机与主机之间的数据交互节点(如请求触发点)提供了天然的监控机会。虚拟化管理层可以在此处无缝拦截 I/O 请求,且无需更改用户虚拟机的任何设置。
- 负载差异规律云环境中工作负载差异显著:观察发现,绝大多数虚拟机的 I/O 操作量较低(呈现“长尾分布”),而少数需要高吞吐量的虚拟机对速度极其敏感。因此,单一监控策略并不适用,需要根据负载情况灵活调整。
VIO 方案设计
针对上述洞察和技术挑战,我们提出了一种名为 VIO 的纯软件解决方案。其核心理念是:将内存缺页处理从硬件数据传输路径中剥离,通过虚拟化管理层提前检测并处理,从而让物理设备完全“看不到”内存缺页。
关键设计 1:内存预检机制(IOPA-Snoop)
实现原理:利用通用虚拟设备标准 VirtIO,当虚拟机准备完成数据请求并发送触发信号时,VIO 会拦截该信号。在通知物理设备前,系统会检查本次请求所需的所有内存区域是否已加载到物理内存中。若存在缺失的页面,虚拟化管理层会立即从存储中加载,确保物理设备访问时所有数据已就绪,从而避免内存缺页发生。
关键设计 2:智能模式切换(弹性直通)
问题背景:虽然每次预检仅需约 4 微秒,但在高负载场景下累积延迟可能影响速度。同时,高吞吐量任务通常需要更多内存,预检带来的内存优化收益有限。
解决方案:通过动态模式适配,VIO 在不同负载下自动切换策略:
- 低负载时(如普通虚拟机):启用预检模式,回收不活跃的内存页面,提升资源利用率;
- 高负载时(如数据库或渲染任务):自动切换到直通模式,跳过预检步骤,确保数据传输速度接近物理设备性能极限。
技术实现:这种切换通过调整设备的“虚拟队列视图”和“内存地址映射表”实现,全程对用户完全无感(无需暂停虚拟机或修改配置)。
关键设计 3:自适应锁页
功能目标:减少预检时需要处理的缺失页面数量,进一步降低开销。
实现方式:系统会持续追踪数据访问模式,识别频繁访问的内存区域(如虚拟设备的数据接收区),并将其锁定在物理内存中。例如,当虚拟网络设备持续接收数据时,系统会自动锁定其接收缓冲区对应的内存,避免频繁的加载与卸载。
方案总结
- 零硬件依赖:完全通过软件实现,无需修改物理设备或驱动。
- 动态切换:根据负载智能切换模式,兼顾内存优化与性能需求。
- 透明兼容:无缝部署到现有虚拟机,无需用户干预。
VIO 已在阿里云几十万台生产虚拟机上成功部署,在不影响服务质量的同时,每日可回收相当于上万台虚拟机的内存。总结而言,VIO 作为一个纯软件方案,在各种负载下都能提供稳定、接近原生的 I/O 性能,有效解决了设备直通带来的内存管理难题,并已在超大规模云环境中证明了其巨大的实用价值。
来源 | 云布道师公众号