检索 NUMA 节点信息

https://bugs.launchpad.net/ironic-python-agent/+bug/1635253

目前,节点内省收集的数据并未向部署者提供有关 NUMA 拓扑的信息。部署者需要有关 NUMA 节点与核心和网卡列表关联的信息。这些细节对于配置使用 DPDK 感知网卡的节点至关重要。

问题描述

为了配置具有更好性能的节点,基于 NUMA 拓扑选择 CPU 变得必要。对于具有 DPDK 感知网卡的节点,轮询模式驱动程序 (PMD) 的 CPU 需要从与 DPDK 网卡关联的 NUMA 节点中选择。如果启用了超线程,则选择逻辑核心需要了解其兄弟线程。这些信息应由部署者从 Swift 存储的数据中读取,并帮助部署者手动配置部署参数以获得更好的性能。

例如,列出可用的 NUMA 感知网卡

$ lspci -nn | grep Eth
82:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
82:00.1 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
85:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
85:00.1 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]

通过 sysfs 从 PCI 设备获取 NUMA 节点 ID

$ cat /sys/bus/pci/devices/0000\:85\:00.1/numa_node
1

为了获得最佳性能,我们需要确保 CPU 核心和网卡位于同一个 NUMA 节点中。在上面的示例中,PCI 地址为 85:00.1 的网卡位于 NUMA 节点 1 中。为了实现最佳性能,该网卡应优先由在 NUMA 节点 1 中的 CPU 核心上运行的 DPDK 轮询模式驱动程序 (PMD) 使用。否则,最佳性能无法保证,因为上述关联将是随机的。

此规范应确保 NUMA 参数可供部署者使用,以确保 PMD 使用正确的逻辑 CPU 以获得更好的性能。

提议的变更

收集的数据将作为 blob 存储在 Swift 中。未来的工作可能会引入 Inspector 插件,以进一步增强 NUMA 架构数据的处理。将使用一个新的可选 Numa 拓扑收集器 来获取以下所需的 NUMA 节点相关信息。

  • NUMA 节点列表 - 应从 /sys/devices/system/node/node<numa_node_id> 获取

  • 与每个 NUMA 节点关联的 CPU 核心列表 - 应从 /sys/devices/system/node/node<numa_node_id>/cpu<thread_id>/topology/core_id 获取

  • 每个核心的 thread_siblings 列表 - 应从 /sys/devices/system/node/node<numa_node_id>/cpu<thread_id> 获取

  • 网络接口的 NUMA 节点 ID - 从 /sys/class/net/<interface name>/device/numa_node 中提取网卡的 NUMA 节点

  • 每个 NUMA 节点可用的 RAM - 应从 /sys/devices/system/node/node<numa_node_id>/meminfo 获取

备选方案

另一种选择是允许使用默认参数进行部署,然后从计算节点识别实际值。然后重新配置正确的参数并重新部署。 提出的更改将在内省阶段向部署者提供 NUMA 拓扑细节,从而避免了重新部署的需要

数据模型影响

存储有关 NUMA 节点、CPU、线程兄弟、ram 和网卡的信息的数据结构应为

{
  "numa_topology": {
      "ram": [{"numa_node": <numa_node_id>, "size_kb": <memory_in_kb>}, ...],
      "cpus": [
        {"cpu": <cpu_id>, "numa_node": <numa_node_id>, "thread_siblings": [<list of sibling threads>]},
        ...,
      ],
      "nics": [
        {"name": "<network interface name>", "numa_node": <numa_node_id>},
        ...,
      ]
    }
  }
}
Where
  • ram 从 NUMA 节点到可用内存的映射

  • cpus 从物理 CPU ID 到 NUMA 节点和兄弟线程列表的映射

  • nics 从网卡名称到 NUMA 节点的映射

示例

{
  "numa_topology": {
      "ram": [
        {"numa_node":0, "size_kb": 2097152},
        {"numa_node":1, "size_kb": 1048576}
      ],
      "cpus": [
        {"cpu": 0, "numa_node": 0, "thread_siblings": [0,1]},
        {"cpu": 1, "numa_node": 0, "thread_siblings": [2,3]},
        ...,
        {"cpu": 0, "numa_node": 1, "thread_siblings": [16,17]},
        {"cpu": 1, "numa_node": 1, "thread_siblings": [18,19]},
        ...,

      ],
      "nics": [
        {"name": "ixgbe0", "numa_node": 0},
        {"name": "ixgbe1", "numa_node": 1}
      ]
    }
  }
}

注意

cpus 中,cpunuma_node 共同构成一个唯一值,因为 cpu_id 对于 NUMA 节点是特定的。并且在 thread_siblings 中指定的线程 ID 在 NUMA 节点中是唯一的。

HTTP API 影响

客户端 (CLI) 影响

Ironic python agent 影响

上述提出的更改将在 IPA 中实现。

性能和可扩展性影响

无。

安全影响

部署者影响

部署者应通过 ipa-inspection-collectors 内核参数启用可选的 Numa 拓扑收集器。部署者将能够获取有关每个 NUMA 节点的内存、CPU、线程兄弟和网卡的信息,这些信息对于配置系统以获得更好的性能非常有用。

开发者影响

实现

负责人

  • karthiks

工作项

  • 在 IPA 中实现收集器以获取 NUMA 拓扑信息

依赖项

测试

将添加单元测试用例。