libvirt 中的 CPU 状态管理

https://blueprints.launchpad.net/nova/+spec/libvirt-cpu-state-mgmt

在许多电信或半静态云环境中,存在一个 bin packing 问题,即节点在所有实际用例中都已满,因为无法再将更多应用程序调度到主机上,但实际上它仍然有未使用的 CPU 核心。

在典型的服务器系统中,空闲的 CPU 核心消耗 3-5 瓦的电力,并产生 3-5 瓦的热量,数据中心的冷却解决方案必须能够容纳这些热量。为了促进降低电力使用和热输出,从而使数据中心更环保、更经济,允许 CPU 的电源状态关闭或使用其他调控器,以便对其进行优化是有意义的。

一种简单的方法是修改 libvirt 驱动程序以支持它,通过修改内核 sysfs 接口中的电源状态来实现。

问题描述

对于我们的大型电信运营商来说,他们经常发现由于每个主机的 CPU pinning/packing 要求,有 2-4 个 CPU 无法使用。每个 CPU 消耗每个核心 3-5 瓦的电力,或每个主机约 12-20 瓦的电力。假设每千瓦时的标价为 0.20 美元,1000 台主机,这意味着他们每年仅因空闲 CPU 使用而浪费 35,040 美元的电费,再加上散热产生的所有热量的额外成本。

此外,虽然许多电信用例需要低延迟和高吞吐量,但并非所有用例都需要 CPU 以最大频率运行。

用例

作为使用 nova libvirt 驱动程序的运营商,我希望能够使用内核 sysfs 接口禁用或降低 CPU 核心的速度。

作为运营商,我希望我的 nova-compute 服务能够在即将启动的新实例使用它时,启用或将 CPU 核心置于最大性能状态。

提议的变更

这个提案包含两个部分
  • 添加一个配置选项以声明 CPU 由管理

  • 添加一个配置选项以告知要使用的性能策略

声明受管理的 CPU

我们可以将一个配置选项添加到硬件部分,以声明主机 CPU 由管理 [1]

# registered in group [libvirt]
cfg.BoolOpt('cpu_power_management',
            default=False,
            help='Use libvirt to manage CPU cores performance.')

如果此选项设置为 True,则在 nova-compute 启动时,由 [compute]/cpu_dedicated_set 选项定义为专用的所有 CPU 将被调整为最低性能(关闭或设置为节能),具体取决于下面解释的另一个 CPU 调整配置选项,但仅当它们不运行实例时。

注意

当然,共享 CPU 不会对其性能进行修改,因为实例在它们之间浮动。如果我们想支持它们,那么所有共享 CPU 核心都应该同时修改,并且一旦实例到达,所有核心都需要具有最大性能。

为每个计算服务定义性能策略

注意

为了简单起见,我们明确声明性能策略将针对主机的所有 CPU 核心定义,而不是针对每个 CPU 核心单独定义。

由于不同的运营商可以选择不同的性能策略,我们让他们决定每个计算服务首选哪一种。当前的性能策略列表将是

  • 在线/离线 CPU 核心

  • performancepowersave CPU 核心调控器之间切换

初始实现不会提出任何其他策略(例如降低 CPU 时钟),我们预计这些其他策略在可预见的未来不会被实现。

注意

运营商有责任验证操作系统内核是否足够新以支持 CPU 核心调整,并且这些 CPU 核心的调控器是否支持 performancepowersave 配置文件。

相应地,将定义一个配置选项以在这些两种策略之间进行选择

# registered in group [libvirt]
cfg.StrOpt('cpu_power_management_strategy',
           choices=['cpu_state', 'governor']
           default='cpu_state',
           help='Tuning strategy to reduce CPU power consumption when '
                'unused')

将定义两个特定的配置选项来告知使用哪些调控器。

# registered in group [libvirt]
cfg.StrOpt('cpu_power_governor_low',
           default='powersave',
           help='Governor to use in order to reduce CPU power consumption')

cfg.StrOpt('cpu_power_governor_high',
           default='performance',
           help='Governor to use in order to have best CPU performance')

实例生命周期

当实例生成(或迁移或恢复)时,我们将使用性能策略来在线化核心或使用最佳调控器。当实例停止(或关机或暂停或搁置卸载或在源主机上处于 confirm-resize 状态)时,我们将离线化核心或使用节能调控器。

请注意,即使我们说验证计算内核是否支持上述两种策略是运营商的责任,但如果我们在尝试在线化核心或修改调控器时遇到错误,我们将返回一个异常,以便实例最终可能处于 ERROR 状态。此外,如果我们在停止实例时无法离线(或节能)CPU 核心,那么我们将提供一个 WARNING 日志到计算日志中。

备选方案

我们可以只执行第一步,并提供一种在 libvirt 驱动程序中禁用检查 CPU 在线状态的方法,而无需同步,但这需要运营商静态管理他们的云,这很麻烦。

我们可以直接在 nova 中执行此操作,并在每次想要新的用例时修改 Nova。不确定我们是否会欣赏这一点。

我们可以使向 Placement API 报告 CPU 可控性通过配置,但这只能解决一个用例,并且仍然需要一些工具来操作配置选项。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

升级影响

无,配置默认值禁用此功能。

实现

负责人

主要负责人

bauzas

其他贡献者

sean-k-mooney

功能联络人

功能联络人

N/A

工作项

  • 添加一个用于 CPU 状态管理的配置选项 [1]

  • 添加一个用于 CPU 调整的配置选项

  • 提供一个 cpu 框架,用于通过 sysfs 管理 CPU 核心调整

  • 修改 libvirt 以在线/性能化 CPU 核心,并在实例生成时使用

  • 修改 libvirt 以离线/节能化 CPU 核心,并在实例停止时使用

  • 修改 init_host() 以将 CPU 核心置于低性能状态(或离线)

依赖项

测试

此规范的测试将使用单元测试和功能测试进行。

文档影响

嗯,通常的那些。

参考资料

历史

修订版

发布名称

描述

瑜伽

引入

Antelope

重新提出