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 核心
在
performance和powersaveCPU 核心调控器之间切换
初始实现不会提出任何其他策略(例如降低 CPU 时钟),我们预计这些其他策略在可预见的未来不会被实现。
注意
运营商有责任验证操作系统内核是否足够新以支持 CPU 核心调整,并且这些 CPU 核心的调控器是否支持 performance 和 powersave 配置文件。
相应地,将定义一个配置选项以在这些两种策略之间进行选择
# 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 |
重新提出 |