使用 PCPU 和 VCPU 在一个实例中¶
https://blueprints.launchpad.net/nova/+spec/use-pcpu-and-vcpu-in-one-instance
该 spec CPU 资源跟踪 将主机 CPU 分割为 PCPU 和 VCPU 资源,使得在同一主机上运行 dedicated CPU 分配策略的实例和 shared CPU 分配策略的实例成为可能。该 spec 旨在创建一种实例,其中一部分 vCPU 是专用 (PCPU) CPU,其余 vCPU 是共享 (VCPU) vCPU,并通过元数据 API 暴露此信息。
问题描述¶
当前的 CPU 分配策略,dedicated 或 shared,应用于实例的所有 vCPU。但是,随着 CPU 资源跟踪 的引入,可以提出一种更细粒度的 CPU 分配策略,该策略基于对单个实例 vCPU 的控制,并为每个实例 vCPU 指定 dedicated 或 shared CPU 分配策略。
用例¶
作为操作员,我希望拥有具有一些实时 CPU 以获得高性能的实例,同时,为了提高实例密度,我希望剩余的 vCPU 与其他实例共享,因为我只关心实时 CPU 的性能。一个例子是在实例中部署增强了 DPDK 框架的 NFV 任务,其中数据平面线程可以使用实时 CPU 处理,而控制平面任务可以在可以与其他实例共享的 CPU 上调度。
作为 Kubernetes 管理员,我希望在 Kubernetes 中运行一个多层或自动扩展的应用程序,该应用程序运行在单个 OpenStack VM 中,并期望使用专用的高性能 CPU 用于应用程序本身,并将容器部署到共享核心上。
提议的变更¶
引入新的 CPU 分配策略 mixed¶
dedicated 和 shared 是现有的实例 CPU 分配策略,用于确定实例 CPU 在主机 CPU 上的调度方式。该规范提出了一种新的 CPU 分配策略,名为 mixed,以创建一种 CPU 混合 实例,使得一些实例 vCPU 从计算节点的 PCPU 资源分配,其余实例 vCPU 从 VCPU 资源分配。从 PCPU 资源分配的 CPU 将被固定到在 CONF.compute.dedicated_cpu_set 中定义的特定主机 CPU 上,而从 VCPU 资源分配的 CPU 将浮动在在 CONF.compute.shared_cpu_set 中定义的主机 CPU 上。在本提案中,我们将这两种 vCPU 分别称为专用 vCPU 和共享 vCPU。
实例 CPU 策略矩阵¶
Nova 操作员可以通过 hw:cpu_policy 和 hw_cpu_policy 接口设置实例 CPU 分配策略,这可能会引发冲突。建议使用以下策略矩阵解决 CPU 策略冲突
实例 CPU 策略 |
hw:cpu_policy |
||||
DEDICATED |
MIXED |
SHARED |
undefined |
||
hw_cpu_policy |
DEDICATED |
dedicated |
conflict |
conflict |
dedicated |
MIXED |
dedicated |
mixed |
conflict |
mixed |
|
SHARED |
dedicated |
conflict |
共享 |
共享 |
|
undefined |
dedicated |
mixed |
共享 |
undefined |
|
例如,如果在实例 flavor 的 hw:cpu_policy 中指定了 dedicated CPU 策略,则无论镜像属性 hw_cpu_policy 中指定的设置如何,实例 CPU 策略都是 dedicated。如果 shared 在 hw:cpu_policy 中显式设置为,则 hw_cpu_policy 中指定的 mixed 策略会发生冲突,这将引发异常,实例启动请求将被拒绝。
如果在 flavor 或镜像属性中未指定显式的实例 CPU 策略,则 flavor 矩阵结果将为“undefined”,最终实例策略将由 flavor extra specs 中指定的 resources:PCPU 和 resources:VCPU 进一步确定和解析。请参阅 section 和 spec CPU 资源跟踪。
影响实时 vCPU¶
实时 vCPU 也独占占用主机 CPU,不会与其他实例共享 CPU,所有实时 vCPU 都是专用 vCPU。对于具有一些实时 vCPU 的混合实例,根据本提案,实例中不在实时 vCPU 列表中的 vCPU 是共享 vCPU。
影响模拟线程策略¶
如果模拟线程策略是 ISOLATE,则混合实例将查找一个专用主机 CPU 用于实例模拟线程,这与 dedicated 策略实例引入的情况非常相似。
如果模拟线程策略是 SHARE,则实例模拟线程将在配置 CONF.compute.cpu_shared_set 中定义的主机 CPU 上浮动。
在 hw:cpu_dedicated_mask 中设置 mixed 实例的专用 CPU 位掩码¶
作为通过旧的 flavor extra specs 或镜像属性创建 mixed 策略实例的接口,引入了 flavor extra spec hw:cpu_dedicated_mask。如果在实例 flavor 中找到 extra spec hw:cpu_dedicated_mask,则可以通过解析 hw:cpu_dedicated_mask 找到专用 CPU 的信息。
以下是创建具有 mixed 策略的实例的示例
$ openstack flavor set <flavor_id> \
--property hw:cpu_policy=mixed \
--property hw:cpu_dedicated_mask=0-3,7
并且,以下是建议的命令,通过在 hw:cpu_dedicated_mask 中设置专用 vCPU 来创建由多个 NUMA 节点组成的混合实例
$ openstack flavor set <flavor_id> \
--property hw:cpu_policy=mixed \
--property hw:cpu_dedicated_mask=2,7 \
--property hw:numa_nodes=2 \
--property hw:numa_cpus.0=0-2 \
--property hw:numa_cpus.1=3-7 \
--property hw:numa_mem.0=1024 \
--property hw:numa_mem.1=2048
注意
请注意,镜像属性中没有 flavor extra spec hw:cpu_dedicated_mask 的等效设置。将不支持通过镜像属性创建混合实例。
注意
混合实例的专用 vCPU 列表可以通过新引入的专用 CPU 掩码或 cpu-time CPU 掩码,即 hw:cpu_realtime_mask 或 hw_cpu_realtime_mask 来指定,您不能同时通过设置专用 CPU 掩码 extra spec 和实时 CPU 掩码来设置它。
通过 resources:PCPU 和 resources:VCPU 创建混合实例¶
CPU 资源跟踪 引入了一种通过 resources:PCPU 和 resources:VCPU 接口创建具有 dedicated 或 shared CPU 分配策略的实例的方法,但没有允许为单个实例同时请求 PCPU 资源和 VCPU 资源。
该规范建议允许实例请求 PCPU 资源以及 VCPU,如果 flavor 列表中未显式指定 cpu_policy,则有效地申请 mixed CPU 分配策略。因此,具有此类 flavor 的实例可能会创建一个 mixed 策略实例
$ openstack flavor set \
--property "resources:PCPU"="<dedicated CPU number>" \
--property "resources:VCPU"="<shared CPU number>" \
<flavor_id>
对于以这种方式创建的混合实例,<共享 CPU 数量> 和 <专用 CPU 数量> 必须都大于零。否则,它有效地创建了 dedicated 或 shared 策略实例,即实例中的所有 vCPU 都在相同的分配策略中。
resources:PCPU 和 resources::VCPU 接口仅将请求发送到 Placement 服务,以确定满足实例 vCPU 线程和模拟线程需求的 PCPU 和 VCPU 资源数量。实例上的 PCPU 和 VCPU 分布,尤其是在具有多个 NUMA 节点的实例上,将以轮询方式在 NUMA 节点上分布,并且 VCPU 将优先于 PCPU。以下是一个示例,flavor 如下
flavor:
vcpus:8
memory_mb=512
extra_specs:
hw:numa_nodes:2
resources:VCPU=3
resources:PCPU=5
实例模拟线程策略未在 flavor 中指定,因此它不占用任何专用的 PCPU 资源,所有 PCPU 和 VCPU 资源将由 vCPU 线程使用,并且 NUMA 节点上的预期分布是
NUMA node 0: VCPU VCPU PCPU PCPU
NUMA node 1: VCPU PCPU PCPU PCPU
注意
所需的实例 CPU 数量是 vCPU 的数量,由 flavor.vcpus 指定,加上专用于模拟线程的 CPU 数量,如果模拟线程策略是 ISOLATE,则实例请求 flavor.vcpus + 1 个 vCPU,如果策略不是 ISOLATE,则实例仅请求 flavor.vcpus 个 vCPU。
备选方案¶
通过扩展 dedicated 策略创建 CPU 混合实例¶
与其添加特殊的实例 CPU 分配策略,不如通过扩展现有的 dedicated 策略并指定固定到从 PCPU 资源选择的主机 CPU 上的 vCPU 来支持 CPU 混合实例。
以下 extra spec 和镜像属性定义用于保留 mixed 策略实例的专用 vCPU
hw:cpu_dedicated_mask=<cpu set string>
hw_cpu_dedicated_mask=<cpu set string>
<cpu set string> 具有与上述相同的定义。
由于它会使 dedicated 策略具有两种含义,具体取决于另一个配置选项,因此该方案被拒绝。
通过 hw:cpu_policy 和 resources:(P|V)CPU 创建 mixed 实例¶
以下命令被建议作为通过显式请求 PCPU 资源并根据 flavor::vcpus 和 PCPU 计数推断 VCPU 计数来创建混合实例的示例
$ openstack flavor create mixed_vmf --vcpus 4 --ram 512 --disk 1
$ openstack flavor set mixed_vmf \
--property hw:cpu_policy=mixed \
--property resources:PCPU=2
由于混合使用了 hw:cpu_policy 和 resources:PCPU,因此该方案被拒绝。不建议将 placement 风格的语法与传统的 extra specs 混合使用。
数据模型影响¶
在 InstanceNUMACell 对象中添加 pcpuset 字段以跟踪实例 NUMA 单元的专用 vCPU,而原始的 InstanceNUMACell.cpuset 则专门用于共享 vCPU。
此变更将为现有实例引入一些数据库迁移工作,该实例采用专用 CPU 分配策略,因为此类实例中的所有 vCPU 都是专用 vCPU,应将其保留在 pcpuset 字段中,但历史上它们存储在 cpuset 中。
REST API 影响¶
元数据 API 将扩展为包含专用 vCPU 信息,并添加新的 OpenStack 元数据版本以指示这是一个新的元数据 API。
将在 meta_data.json 中添加新字段。
dedicated_cpus=<cpu set string>
<cpu set string> 列出了实例的专用 vCPU 集合,这可能是 hw:cpu_dedicated_mask 或 hw:cpu_realtime_mask 或 hw_cpu_realtime_mask 的内容,或者如 章节 中所述,使用轮询策略生成的 CPU 列表。
新的 cpu 策略 mixed 已添加到 extra spec hw:cpu_policy 中。
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
如果最终用户想要使用 mixed CPU 分配策略创建实例,则要求用户设置相应的 flavor extra specs 或镜像属性。
性能影响¶
此提案会影响实例 CPU 分配策略的选择,但性能影响微不足道。
其他部署者影响¶
无
开发人员影响¶
无
升级影响¶
只有在整个集群升级完成后,mixed cpu 策略才可用。将升级服务版本以检测升级。
为专用 vCPU 引入 InstanceNUMACell.pcpuset,而 InstanceNUMACell.cpuset 专用于共享 vCPU。采用 dedicated CPU 分配策略的所有现有实例都应通过将 InstanceNUMACell.cpuset 字段中的内容移动到 InstanceNUMACell.pcpuset 字段来更新。保存 InstanceNUACell 对象的底层数据库也需要更新以反映此更改。
实现¶
负责人¶
- 主要负责人
Wang, Huaqiang <huaqiang.wang@intel.com>
功能联络人¶
- 功能联络人
Stephen Finucane <stephenfin@redhat.com>
工作项¶
为专用 vCPU 添加一个新字段,即
InstanceNUMACell的pcpuset。添加新的实例 CPU 分配策略
mixed属性并解决冲突升级 nova 服务版本以指示 nova-compute 中的新 CPU 策略
添加 flavor extra spec
hw:cpu_dedicated_mask并创建混合实例将专用和共享 CPU 请求转换为 placement
PCPU和VCPU资源请求。更改 libvirt 驱动程序以创建
PCPU映射和VCPU映射通过在
dedicated_cpus字段中提供最终的 pCPU 布局来添加 nova 元数据服务验证
mixed实例的实时 CPU 掩码。
依赖项¶
无
测试¶
需要功能和单元测试来覆盖
确保解决 CPU 策略矩阵之间的冲突
确保只有专用 vCPU 才有可能成为实时 vCPU
确保通过 flavor 设置或通过
resources::PCPU=xx和resources::VCPU=xx设置正确创建mixed策略实例。确保共享 vCPU 在
dedicatedvCPU 之前放置确保根据其策略正确调度模拟器 CPU。
文档影响¶
应更改文档以介绍新的 mixed CPU 分配策略和新的 flavor extra specs 的用法。
元数据服务将相应地更新。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
Train |
引入,放弃 |
Ussuri |
已批准 |
Victoria |
重新提出 |