显示服务器 NUMA 拓扑

将 NUMA 添加到新的子资源 GET /servers/{server_id}/topology API。

https://blueprints.launchpad.net/nova/+spec/show-server-numa-topology

问题描述

存在与服务器相关的 NUMA 信息,对最终用户和管理员都有用,但目前没有可用的 API 来检索这些信息。

API GET /serversGET /servers/{id} 可以列出额外的规格,这些规格可能包含一些关于 guest numa 拓扑的提示,但很难解释。

用例

  • 管理员希望在不登录到 guest VM 的情况下查看拓扑(RAM、CPU)。

  • 管理员希望有一种统一的方式来获取拓扑信息,而与各种 guest OS 如何暴露它无关。

  • 管理员希望了解一个或多个实例的虚拟到物理映射,以便进行调试,并且管理员需要确保 NUMA 拓扑是预期的,并且已正确映射到 Host。

  • 如果管理员允许,最终用户可以拥有上述所有功能,方法是更改策略规则。

提议的变更

在 nova 中,NUMA 拓扑包含一组相关的属性,例如 NUMA 单元管理的内存量、NUMA 单元上支持的内存页大小、vCPU 线程到逻辑主机处理器的映射以及 cpu 线程策略。 本规范提出一个 API 来呈现所有这些 NUMA 信息,包括虚拟到物理的映射。

本规范建议在 servers API 中添加一个新的子资源 ‘topology’

GET /servers/{server_id}/topology

默认情况下,此 API 仅供管理员使用,可以通过更改默认策略规则将其暴露给用户/角色。

API 返回属于一个服务器的每个 cell 的信息,包括 socket、cpu、thread、mem、page size、cpuset、CPU pinned 信息、siblings、thread policy、CPU pinning、host NUMA node number。

如果没有可用的 NUMA 信息,则相应 key 的值将简单地设置为 None。

备选方案

与其将这些信息放入 GET /servers/{server_id}/topology 中,还有另外 2 个选项

  • 将 NUMA 信息添加到现有的子资源 diagnostics 中:GET /servers/{server_id}/diagnostics 返回一个服务器的 NUMA 信息。 由于 NUMA 拓扑对于给定的服务器不会改变,因此最好将其放在新的 topology 子资源下。

  • 将 NUMA 信息放在 GET /servers/{id}GET /servers/detail 下。 这将对性能产生负面影响,因为它需要额外的数据库查询(通过 InstanceNUMATopology 对象的方法 get_by_instance_uuid)。

数据模型影响

REST API 影响

API GET /servers/{server_id}/topology 将使用新的 microversion 显示 NUMA 信息。

NUMA 拓扑返回的信息

{
      # overall policy: TOPOLOGY % 'index
      "nodes":[
                 {
                   # Host Numa Node
                   # control by policy TOPOLOGY % 'index:host_info'
                   "host_numa_node": 3,
                   # 0:5 means vcpu 0 pinning to pcpu 5
                   # control by policy TOPOLOGY % 'index:host_info'
                   "cpu_pinning": {0:5, 1:6},
                   "vcpu_set": [0,1,2,3],
                   "siblings": [[0,1],[2,3]],
                   "memory_mb": 1024,
                   "pagesize_kb": 4096,
                   "sockets": 1,
                   "cores": 2,
                   # one core has at least one thread
                   "threads": 2
                 }
                 ...
                ], # nodes

     "cpu_thread_policy": "prefer"

 }

安全影响

  • 此 API 暴露的信息默认情况下仅供管理员使用,并且精细控制策略 TOPOLOGY % 'index:host_info' 用于将仅限 host 的信息保留给管理员,而此 API 暴露给最终用户。

  • 添加新的 topology 策略,默认情况下仅供管理员使用

    TOPOLOGY = 'os_compute_api:servers:topology:%s'
    
    server_topology_policies = [
        policy.DocumentedRuleDefault(
            BASE_POLICY_NAME,
            base.RULE_ADMIN_API,
            "Show the topology data for a server",
            [
                {
                    'method': 'GET',
                    'path': '/servers/{server_id}/topology'
                }
            ]),
        policy.DocumentedRuleDefault(
            # control host numa node and cpu pin information
            TOPOLOGY % 'index:host_info',
            base.RULE_ADMIN_API,
            "List all servers with detailed information",
            [
                {
                    'method': 'GET',
                    'path': '/servers/{server_id}/topology'
                }
            ]),
    ]
    

通知影响

N/A

其他最终用户影响

  • python novaclient 和 python-openstackclient 将显示 numa_topology 信息。

性能影响

其他部署者影响

N/A

开发人员影响

N/A

升级影响

N/A

实现

负责人

主要负责人

Yongli He

工作项

  • 为此更改添加新的微版本。

依赖项

N/A

测试

  • 添加功能 api_sample 测试。

文档影响

API 文档应更改为介绍此新功能。

参考资料

历史

修订版

发布名称

版本

Stein

首次引入