libvirt 驱动程序中域列表加速

https://blueprints.launchpad.net/nova/+spec/libvirt-domain-listing-speedup

libvirt 驱动程序目前使用遗留的 libvirt API 获取域列表。这些 API 效率低下且容易出现竞争条件,因此已被设计更好的 API 取代。

问题描述

Nova 中的 libvirt 驱动程序目前使用 numOfDomains、listDomainsID、numOfDefinedDomains、listDefinedDomains、lookupByID 和 lookupByName 的组合来列出主机上的域。这效率非常低,因为它需要 O(N) 个 libvirt API 调用来列出 ‘N’ 个虚拟机。它还存在固有的竞争条件,即在域从关机到运行状态的转换过程中,Nova 可能会丢失该虚拟机,而域列表正在被获取。

libvirt 0.9.13 版本引入了一种新的方法 listAllDomains,可用于替换所有这些调用,从而提供一种获取域列表的方法,无论有多少域,其执行时间都是恒定的。

提议的变更

将引入一种新的方法 ‘list_instance_domains’,它将尝试使用 listAllDomains 方法来获取域列表,并在 libvirt 版本或正在使用的虚拟机监控程序驱动程序不支持该方法时回退到使用旧方法。

它将返回一个 libvirt.virDomain 对象实例列表,而不仅仅是返回域 ID、名称或 UUID 的列表,从而避免了单独查找的需要。

默认情况下,它只会返回最初由 Nova 启动的正在运行的实例。可以选择性地告诉它包含非活动实例、由其他系统(例如 libguestfs)启动的实例或 Xen Domain-0 实例。

libvirt 驱动程序中所有调用 list_instances 或 list_instance_ids 的地方都将更改为使用这种新方法,从而显著提高其可扩展性。

备选方案

继续使用当前的 API,但这效率低下且容易出现竞争条件,因此并非理想选择

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

当使用 libvirt >= 0.9.13 时,它将提高 libvirt 驱动程序的性能,尤其是在主机上有大量实例的情况下。

其他部署者影响

强烈建议部署者使用 libvirt >= 0.9.13 以充分利用性能改进。

开发人员影响

实现

负责人

主要负责人

berrange

工作项

  • 实现新的 list_instance_domains 方法

  • 为 list_instance_domains 编写测试用例

  • 将 libvirt 驱动程序转换为使用 list_instance_domains

依赖项

  • 当前的最小 libvirt 版本是 0.9.6,但此功能需要 0.9.13。将为与 0.9.6 版本一起使用提供回退代码。

测试

当前的 tempest gate 测试应该完全执行新的代码路径。

文档影响

建议部署 libvirt >= 0.9.13 以获得最佳的可扩展性。

参考资料