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 )?

我试图通过 numa_distance() 和其他相关函数(从第一个 link 开始),但无法理解。我只是想了解 linux 如何计算两个节点之间的 NUMA 距离,据说这个距离根据体系结构和 NUMA interlink.

而变化

我提到了以下 links:

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

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

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

在 ACPI 规范(最新版本)中,您会找到对名为 "SLIT"/系统位置(距离)信息 Table 的 table 的描述。 table 只是一个数组(如 d = array[numa_node][numa_node]),操作系统使用它来确定任意 2 个 NUMA 节点之间的相对距离;其中数组中的值范围从 10 到 254(255 用于 "no connection between these NUMA domains"),其中值 10 表示 NUMA 域中的某些内容访问同一 NUMA 域中的内容的速度(最快的情况)和值 254 会慢 25.4 倍。

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

固件将此 table 提供给 OS。 OS 不计算任何东西。

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

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