检索 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 中,cpu 和 numa_node 共同构成一个唯一值,因为 cpu_id 对于 NUMA 节点是特定的。并且在 thread_siblings 中指定的线程 ID 在 NUMA 节点中是唯一的。
HTTP API 影响¶
无
客户端 (CLI) 影响¶
无
Ironic python agent 影响¶
上述提出的更改将在 IPA 中实现。
性能和可扩展性影响¶
无。
安全影响¶
无
部署者影响¶
部署者应通过 ipa-inspection-collectors 内核参数启用可选的 Numa 拓扑收集器。部署者将能够获取有关每个 NUMA 节点的内存、CPU、线程兄弟和网卡的信息,这些信息对于配置系统以获得更好的性能非常有用。
开发者影响¶
无
依赖项¶
无
测试¶
将添加单元测试用例。