尧图精选

Linux PPC NUMA 资源关联性(Associativity)解析:Form 0/Form 1/Form 2 三种格式与设备树实现

🕒 发布时间:2026/9/12 11:31:33 📁 来源:尧图网络
Linux PPC NUMA 资源关联性Associativity解析Form 0/Form 1/Form 2 三种格式与设备树实现【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux导读本文基于 Linux 内核源码仓库中的 Documentation/arch/powerpc/associativity.rst 文档深入讲解 PowerPC尤其是 pSeries 平台上 NUMA 资源关联性Associativity的完整概念与实现。读者将掌握三种关联性格式Form 0、Form 1、Form 2的差异、PAPR 规范通过哪些设备树属性向操作系统传递资源分组信息、Linux 内核如何根据这些属性计算 NUMA 距离以及 Form 2 中ibm,numa-lookup-index-table与ibm,numa-distance-table的编码格式与距离矩阵推导方法。文章同时结合 arch/powerpc/mm/numa.c 等源码实现为理解 pSeries/PowerNV 上的 NUMA 拓扑初始化提供从文档到代码的完整对照。什么是资源关联性Associativity在 PowerPC 平台中关联性Associativity表示将各种平台资源CPU、内存、IO 等划分到多个域domain的集合关系同一域内的资源彼此之间具有大体相近的平均性能而域内某些子集之间的性能又优于其与域外资源子集之间的性能从而形成嵌套的子分组域sub-grouping domain。在 Linux 内核中这种性能特征最终以NUMA 节点距离NUMA node distance的形式呈现距离越小表示两个节点间的访问延迟/带宽越优。从平台固件/Hypervisor的角度看这些分组也被称为域domains。PAPRPower Architecture Platform Requirements接口目前支持三种向 OS 传递资源分组信息的方式分别称为Form 0、Form 1、Form 2关联性分组Form 0最古老的格式只支持 LOCAL 与 REMOTE 两种 NUMA 距离现已视为弃用deprecatedForm 1通过ibm,associativity与ibm,associativity-reference-points两个设备树属性组合计算 NUMA 距离Form 2增加独立的设备树属性直接表达 NUMA 距离距离计算更灵活且允许稀疏的主域编号domainID。Hypervisor 如何指示关联性格式Hypervisor 通过ibm,architecture-vec-5属性告知 OS 当前使用的是哪一种关联性格式。该属性是 PAPR架构选项向量 5Option Vector 5的一部分ibm,architecture-vec-5属性第 5 字节byte 5的bit 0指示使用 Form 0 还是 Form 1值为1表示使用 Form 1 关联性第 5 字节的bit 2用于指示 Form 2 关联性。在内核源码中与这些位对应的选项向量宏定义于 arch/powerpc/include/asm/prom.h#define OV5_FORM1_AFFINITY 0x0580 /* FORM1 NUMA affinity */ #define OV5_PRRN 0x0540 /* Platform Resource Reassignment */ #define OV5_FORM2_AFFINITY 0x0520 /* Form2 NUMA affinity */内核在启动早期通过 arch/powerpc/kernel/prom_init.c 构造ibm_architecture_vec时同时声明了对 Form 1 与 Form 2 的支持而固件侧最终实际采用哪种格式则由 arch/powerpc/platforms/pseries/firmware.c 将 OV5 选项位映射为固件特性firmware feature{FW_FEATURE_FORM1_AFFINITY, OV5_FORM1_AFFINITY}, {FW_FEATURE_FORM2_AFFINITY, OV5_FORM2_AFFINITY},对应的固件特性位定义在 arch/powerpc/include/asm/firmware.h而内核在 arch/powerpc/mm/numa.c 的find_primary_domain_index()中按优先级判定最终生效的关联性形式OPALPowerNV平台固定为 Form 1pSeries 上若固件声明了 Form 2 特性则用 Form 2否则依次回退 Form 1、Form 0。Form 0最简的 LOCAL/REMOTE 二分距离Form 0 是历史最悠久的关联性格式仅支持两个 NUMA 距离LOCAL本地与REMOTE远端。在内核通用定义中include/linux/topology.h 给出了这两个基准距离的默认数值#define LOCAL_DISTANCE 10 #define REMOTE_DISTANCE 20对应到 arch/powerpc/mm/numa.c 的__node_distance()实现当affinity_form FORM0_AFFINITY时逻辑极其简单else if (affinity_form FORM0_AFFINITY) return ((a b) ? LOCAL_DISTANCE : REMOTE_DISTANCE);即同一节点距离为LOCAL_DISTANCE10不同节点一律为REMOTE_DISTANCE20。此外在 Form 0 下ibm,associativity-reference-points属性要求至少有 2 个条目第一个整数面向 SMP 配置、第二个面向普通 NUMA 配置不足时内核会打印short ibm,associativity-reference-points警告并放弃见 arch/powerpc/mm/numa.c。由于无法表达中间层级的拓扑距离Form 0 无法刻画多级分组下的性能差异因此已被 PAPR 标记为弃用格式。Form 1基于关联性列表与参考点的距离计算Form 1 通过组合使用ibm,associativity与ibm,associativity-reference-points两个设备树属性来确定资源组/域之间的 NUMA 距离。ibm,associativity资源的域分组列表该属性包含一个或多个数字每个数字是一个domainID表示资源所处的平台分组域从最顶层最粗粒度到最底层最细粒度逐级排列。属性采用prop-encoded-array编码第一个整数为列表长度 N其后为 N 个以encode-int编码的 domainID。ibm,associativity-reference-points参考点索引该属性同样包含一个或多个数字domainID index表示在关联性列表中的基于 1 的序数1-based ordinal即指出关联性数组中的第几个元素是第几级分组的域 ID。参考点列表表达了一个逐级递增的资源分组层级例如{ primary domainID index, secondary domainID index, tertiary domainID index.. }第一个数字指向最显著最高层的 NUMA 边界其后的数字指向逐渐次要的边界可以有多个 NUMA 层级。Linux 内核的计算规则NUMA 节点 ID 的确定Linux 内核取主域参考点primary domainID index所指位置的 domainID 作为 NUMA 节点 ID。源码中__associativity_to_nid()arch/powerpc/mm/numa.c正是执行primary_domain_index - 1后读取关联性数组中的对应元素作为 nid并兼容 POWER4 LPAR 用0xffff表示无效节点的历史行为。NUMA 距离的计算内核通过递归比较两个域是否属于同一更高层域来计算机器之间的距离。从最顶层参考点开始逐级向下比较只要在某一级发现两者属于不同分组即该级 domainID 不同就在距离上加倍一次。对应源码为 arch/powerpc/mm/numa.cfor (i 0; i distance_ref_points_depth; i) { if (distance_lookup_table[a][i] distance_lookup_table[b][i]) break; /* Double the distance for each NUMA level */ distance * 2; }距离从LOCAL_DISTANCE10开始每多一级不匹配就乘以 2。同样的逐级比较逻辑也体现在 CPU 相对距离计算函数__cpu_form1_relative_distance()arch/powerpc/mm/numa.c中两个 CPU 在各级参考点索引处比较关联性值逐级累加不匹配计数。Form 1 下内核在初始化阶段通过initialize_form1_numa_distance()arch/powerpc/mm/numa.c将每个节点的各级域 ID 填入distance_lookup_table[MAX_NUMNODES][MAX_DISTANCE_REF_POINTS]供后续距离计算直接查表。Form 2独立距离表与稀疏域编号Form 2 关联性格式通过新增独立的设备树属性直接表达 NUMA 节点距离使距离计算从参考点索引值中解耦从而更加灵活灵活的主域编号由于距离计算不再依赖ibm,associativity-reference-points属性中的索引值Form 2 允许在同一个 domainID index 位置上出现大量不同的主域 ID用以表示性能/延迟特征各异的资源组不再受连续编号或固定层级的约束。Hypervisor 使用ibm,architecture-vec-5属性的第 5 字节bit 2指示启用了 Form 2 关联性。内核通过FW_FEATURE_FORM2_AFFINITY固件特性识别arch/powerpc/include/asm/firmware.h并在 arch/powerpc/mm/numa.c 中据此将affinity_form置为FORM2_AFFINITY。ibm,numa-lookup-index-table域 ID 索引表该属性包含一个或多个数字表示系统中存在的所有 domainID。domainID 在该属性中的偏移量offset被用作计算 NUMA 距离时的索引本文档将其称为域距离偏移domain distance offset。编码格式prop-encoded-array先用encode-int编码 domainID 的数量 N随后是 N 个以encode-int编码的 domainID。示例ibm,numa-lookup-index-table {4, 0, 8, 250, 252}其中第一个元素 4 表示表中有 4 个 domainID0、8、250、252。当计算域 8 与系统中其他域的距离时使用域 8 在该表中的偏移量2。ibm,numa-distance-tableNUMA 距离表该属性包含一个或多个数字表示系统中各资源组/域之间的 NUMA 距离。编码格式prop-encoded-array先用encode-int编码距离值的数量 N随后是 N 个以encode-bytes编码的距离值。单个距离值的最大可编码值为 255。数量 N 必须等于 m 的平方其中 m 是ibm,numa-lookup-index-table中 domainID 的数量。完整的 Form 2 示例文档给出的完整示例为ibm,numa-lookup-index-table 3 0 8 40; ibm,numa-distace-table 9, /bits/ 8 10 20 80 20 10 160 80 160 10;查找索引表包含 3 个 domainID0、8、40因此距离表包含 3² 9 个距离值展开为如下 3×3 距离矩阵| 0 8 40 --|------------ | 0 | 10 20 80 | 8 | 20 10 160 | 40| 80 160 10可见0 与 0、8 与 8、40 与 40对角线距离为 10即LOCAL_DISTANCE0 与 8 互为 20即REMOTE_DISTANCE级别40 与 0、8 的距离高达 80/160属于远距离的第三级拓扑矩阵沿对角线对称符合距离的对称性。对应地节点 0、8、40 可能的ibm,associativity属性为{ 3, 6, 7, 0 } { 3, 6, 9, 8 } { 3, 6, 7, 40}配合ibm,associativity-reference-points取{ 0x3 }指向关联性列表的第 3 个元素即倒数第二级内核根据该参考点读取每个资源关联性列表中第 3 个位置的 domainID 作为主域编号0、8、40从而与查找索引表对齐。内核中的 Form 2 初始化流程initialize_form2_numa_distance_lookup_table()arch/powerpc/mm/numa.c负责在启动阶段构建 Form 2 距离矩阵核心步骤从/ibm,opalPowerNV、/rtas或根节点/读取ibm,numa-lookup-index-table其首元素即 domainID 数量max_numa_index将后续的 domainID 依次填入numa_id_index_table[]读取ibm,numa-distance-table首元素为距离值数量跳过该encode-int头后即为字节流形式的距离值校验form2_distances_length max_numa_index * max_numa_index不满足时打印Wrong NUMA distance information警告并放弃使用该表回退为相同节点 LOCAL、不同节点 REMOTE的保守距离双重循环填充numa_distance_table[nodeA][nodeB]将稀疏的 domainID 映射为稠密的距离矩阵。值得注意的边界处理如果距离表缺失或长度错误内核仍会将所有numa_distance_table初始值-1替换为合理的默认距离保证系统可以启动。Form 2 下的距离查询一旦进入 Form 2 模式__node_distance()直接查表返回if (affinity_form FORM2_AFFINITY) return numa_distance_table[a][b];同样地CPU 相对距离__cpu_form2_relative_distance()arch/powerpc/mm/numa.c先由两个 CPU 的关联性列表解析出各自的 nid再查numa_distance_table并按LOCAL_DISTANCE≤10、REMOTE_DISTANCE≤20与更远距离三档归类。此外Form 2 下所有可能 NUMA 节点的距离信息要求在启动阶段一次性全部提供见update_numa_distance()中 arch/powerpc/mm/numa.c 的注释与WARN检查热插拔新增节点时若在距离表中找不到对应条目会触发告警。稀疏矩阵的紧凑表达优势ibm,numa-lookup-index-table帮助实现距离矩阵的紧凑表达由于 domainID 可以稀疏例如示例中的 0、8、40 之间有大段空洞如果直接用 domainID 本身作为矩阵下标距离矩阵会产生大量无意义的空洞。借助查找索引表把稀疏 domainID 压缩为连续的小整数偏移再用这些偏移索引距离表即可有效压缩距离信息的存储空间这正是 Form 2 设计的核心收益之一。三种格式对比与内核选择逻辑特性Form 0Form 1Form 2状态弃用deprecated常用pSeries 新型格式距离种类仅 LOCAL / REMOTE 两种由参考点层级决定逐级加倍任意值单值上限 255由距离表决定关键设备树属性ibm,associativity-reference-pointsibm,associativityibm,associativity-reference-points增加ibm,numa-lookup-index-tableibm,numa-distance-table主域编号固定索引由参考点索引决定灵活允许同索引处多个主域 ID距离表稀疏支持无无通过查找索引表紧凑表达稀疏矩阵ibm,architecture-vec-5指示位默认bit00byte5 bit01byte5 bit21内核在 arch/powerpc/mm/numa.c 中定义了三种形式的常量并维护全局affinity_form状态find_primary_domain_index()依据固件特性按OPAL→Form 1、Form 2→Form 1→Form 0的顺序确定最终形式arch/powerpc/mm/numa.c随后整个 NUMA 初始化、距离计算与热插拔更新逻辑均围绕该形式分派执行。若关联性形式检测失败例如缺少ibm,associativity-reference-points内核会回退到无 NUMA 的单节点模式NUMA_NO_NODE保证系统仍可引导。进一步阅读关联性设备树属性与距离编码的完整规范说明Documentation/arch/powerpc/associativity.rstpSeries NUMA 核心实现形式判定、距离表初始化、节点映射arch/powerpc/mm/numa.cOV5 选项向量与固件特性定义arch/powerpc/include/asm/prom.h、arch/powerpc/include/asm/firmware.h启动期架构向量构造与固件特性映射arch/powerpc/kernel/prom_init.c、arch/powerpc/platforms/pseries/firmware.c通用 NUMA 距离基准值定义include/linux/topology.h【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →