linux如何计算两个numa节点之间的numa距离(任何numa库的内部逻辑,如libnuma..etc)?

Posted

技术标签:

【中文标题】linux如何计算两个numa节点之间的numa距离(任何numa库的内部逻辑,如libnuma..etc)?【英文标题】:How does linux calculate numa distance between two numa nodes ( internal logic of any numa library such as libnuma..etc )? 【发布时间】:2018-03-19 04:25:17 【问题描述】:

我试图通过 numa_distance() 和其他相关函数(来自第一个链接),但无法理解。我只是想了解 linux 如何计算两个节点之间的 NUMA 距离,而据说这个距离会根据架构和 NUMA 互连而变化。

我参考了以下链接:

    https://github.com/jmesmon/numactl/blob/0df3f720e606a3706700e0487ba19d720f50c4b8/distance.c

    https://github.com/jmesmon/numactl/blob/0df3f720e606a3706700e0487ba19d720f50c4b8/numa.h

    https://github.com/jmesmon/numactl/blob/0df3f720e606a3706700e0487ba19d720f50c4b8/libnuma.c

【问题讨论】:

【参考方案1】:

在 ACPI 规范(最新版本)中,您会找到一个名为“SLIT”/系统位置(距离)信息表的表的描述。该表只是一个数组(如d = array[numa_node][numa_node]),操作系统使用它来确定任意2 个NUMA 节点之间的相对距离;其中数组中的值范围从 10 到 254(255 用于“这些 NUMA 域之间没有连接”),其中值 10 表示 NUMA 域中的某物可以多快访问同一 NUMA 域中的某物(最快的情况) 值 254 会慢 25.4 倍。

我假设固件使用硬编码值填充此表 - 例如主板制造商可能会进行一些测量并确定对于主板支持的所有 CPU 型号来说足够好的值。

固件将此表提供给操作系统。操作系统不计算任何东西。

【讨论】:

我刚刚看到 /sys/devices/system/node/node0/distance 里面有“10”......我猜是距离(我是单节点机器......它只是与自身有距离)。这是给我们提供您所说的距离信息的文件吗? 我检查了我的机器(2 个 NUMA 节点),上面写着 10 21。看起来/sys/devices/system/node/node0/distance 只是在反省 ACPI 提供的信息。 太棒了!非常感谢。 这个二维数组是否可能是不对称的,例如从节点 a 到 b 的距离与从 b 到 a 的距离不同? @blaze9:理论上,是的(例如,转发环——A 转发给 B,B 转发给 C,C 转发给 A;只要到达正确的节点就停止)。我不确定在实践中是否为 NUMA 做过任何事情(大多数 NUMA 使用双向链接)。【参考方案2】:

距离由固件硬编码在 ACPI SLIT 表中,表示 NUMA 节点之间的相对内存延迟 - “10”距离意味着 1x 的延迟,“20”的距离是“2x”的延迟比本地节点访问。 Linux 在 sysfs 中公开了这些值,但是有很多方法可以访问它们(包括直接转储 ACPI 表,如果你喜欢的话)。

节点之间的实际内存延迟很少像 ACPI 表声称的那样糟糕,至少从我的测试来看,http://www.codeblueprint.co.uk/2019/07/12/what-are-slit-tables.html

【讨论】:

以上是关于linux如何计算两个numa节点之间的numa距离(任何numa库的内部逻辑,如libnuma..etc)?的主要内容,如果未能解决你的问题,请参考以下文章

怎么查看一个计算节点具体的Numa资源分布详情

在 linux(CentOS)/多处理器设置中,如何将 CPU 内核分配给 NUMA 节点?

NUMA架构的优缺点

NUMA架构的优缺点

如何在 NUMA 机器上的不同节点上分配数组的一部分?

用于测量 Linux 中 NUMA 节点缓存未命中/命中的工具?