Libvirt 文件支持的内存

蓝图规范 libvirt-file-backed-memory https://blueprints.launchpad.net/nova/+spec/libvirt-file-backed-memory

随着大容量内存设备的发展,现在使用文件支持的内存运行虚拟机是合理的。这使得每个计算节点拥有更大的总内存区域

问题描述

新的内存技术和现代 NVMe SSD 已经发展到可以使用这些设备作为虚拟机内存的后端存储,以扩展计算主机的内存容量的程度。

用例

作为操作员,我希望能够利用 libvirt 对文件支持的内存技术的支持,来扩展我的计算节点内存容量。

提议的变更

建议的更改是在 nova.conflibvirt 部分添加一个新的选项来配置文件支持的内存

  • file_backed_memory

file_backed_memory 默认值为 0,表示禁用文件支持的内存。当设置为非零值时,libvirt 驱动程序将在实例中包含启用文件支持的内存的元素。

file_backed_memory 设置为非零值时,libvirt 驱动程序将为计算节点上的所有实例包含一个 MemoryBacking 元素,其中包含一个类型为 filesource 子元素,以及一个模式为 sharedaccess 子元素。

file_backed_memory 中配置的值将由 libvirt 驱动程序作为计算节点的总内存容量(以 MiB 为单位)报告。由于内存容量取决于使用的后端存储,libvirt 必须报告与实际系统内存容量不同的值。可用容量将从 file_backed_memory 中的值减去实例当前使用的内存量来计算。系统内存将通过内核页面缓存用作文件支持的内存的缓存。

由于预计文件支持的内存无法正常工作,因此启用此选项需要将 nova.conf 中的 ram_allocation_ratio 的值设置为 1.0,如果未正确配置,将阻止 Nova 启动。

注意

需要使用 shared 访问模式,因为 private 访问不会为实例使用的页面使用底层的后端存储,而是将这些页面保存在主系统内存中。

注意

在迁移期间,必须检查目标计算节点是否具有 file_backed_memory 选项,并根据需要添加或删除 MemoryBacking 元素和子元素,以确保在迁移过程中正确分配内存。这可以在 nova/virt/libvirt/migration.py 中的 get_updated_guest_xml 方法中完成,类似于今天处理图形、串口、卷和性能事件的方式。

注意

从运行没有此功能的 Nova 版本的计算节点迁移将不会包含文件支持的内存的适当 libvirt XML。Nova 将阻止这些迁移,以确保迁移到启用 file_backed_memory 的节点的所有实例实际上正在使用文件支持的内存。迁移将在 check_can_live_migrate_destination 中被阻止

备选方案

在 Nova 中,可以动态检测可用内存容量。由于内存和 SSD 技术的种类以及可以在 libvirt 和系统内配置内存后端目录的方式,这将需要实现一个外部调用点来确定可用容量,或者需要在 Nova 中包含特定于供应商的代码。任何一种选择都会显著增加此规范的范围。

在 Nova 中,可以通过 flavor extra-spec 启用文件支持的内存,从而允许对单个实例进行控制。这将导致 RAM 和后端设备的不一致使用,从而导致计算节点上内存容量计算混乱/冲突。

完全不实现此规范。在这种情况下,计算节点将限制为计算节点中标准 DRAM 的容量。

数据模型影响

REST API 影响

安全影响

由于实例内存现在包含在文件系统上的文件中,因此实例内存可供拥有访问这些文件所需权限的用户拥有的任何进程访问。目前,计算节点上的 root 用户已经能够读取系统内存和虚拟机内存。

通知影响

其他最终用户影响

性能影响

当启用 file_backed_memory 选项时,实例内存性能将取决于操作员配置的后端存储。

其他部署者影响

需要显式启用新的配置选项才能生效。

在启用新的配置选项之前,操作员应配置 libvirt memory_backing_dir 配置设置,以指向其选择的后端存储,例如 NVMe 设备上的文件系统。

启用 file_backed_memory 将拒绝来自运行不支持文件支持的内存的 Nova 版本的计算节点的迁移。

开发人员影响

升级影响

启用 file_backed_memory 将拒绝来自运行不支持文件支持的内存的 Nova 版本的计算节点的迁移。

建议在升级所有计算节点后才启用 file_backed_memory

实现

负责人

主要负责人

Zack Cornelius <zcornelius>

其他贡献者

工作项

  • 向 nova.conf 添加新的配置选项

  • 在 libvirt 驱动程序中检查配置选项,并报告文件支持的容量值,而不是系统内存

  • 根据需要生成额外的 libvirt 域 XML

  • 验证/更正迁移过程中的 libvirt 域 XML

依赖项

  • Qemu >= 2.6.0

  • Libvirt >= 4.0.0

测试

将添加单元测试以验证在主机上启动的实例是否在主机的 libvirt memory_backing_dir 中具有文件。

需要一个测试用例来处理在启用新选项的主机与未启用新选项的主机之间迁移的边缘情况,以确保内存从正确的来源分配。

我们将研究通过创建一个大的 ramdisk、启用这些设置并验证实例是否正在使用 ramdisk 上的文件来添加集成测试。我们认为这种测试布局是可行的,但如果不可行,将退回到仅依赖单元测试。

文档影响

应使用新的配置选项更新 nova.conf 的文档。

参考资料

历史

修订版

发布名称

描述

Rocky

引入