我试着浏览了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
在 ACPI 规范的(最新版本(中,您将找到名为"SLIT"/系统位置(距离(信息表的表的说明。此表只是一个数组(如 d = array[numa_node][numa_node]
(,操作系统使用它来确定任何 2 个 NUMA 节点之间的相对距离;其中,数组中的值范围为 10 到 254(255 用于"这些 NUMA 域之间没有连接"(,其中值 10 表示 NUMA 域中的某些内容访问同一 NUMA 域中的某些内容的速度(最快情况(,值 254 将慢 25.4 倍。
我假设固件使用硬编码值填充此表 - 例如,主板制造商可能会进行一些测量并确定对于主板支持的所有型号的 CPU 来说足够好的值。
固件向操作系统提供此表。操作系统不计算任何内容。
距离由 ACPI SLIT 表中的固件硬编码,表示 NUMA 节点之间的相对内存延迟 - 距离"10"表示延迟为 1x,距离"20"表示延迟比本地节点访问高"2 倍"。Linux 在 sysfs 中公开这些值,但有很多方法可以访问它们(包括直接转储 ACPI 表,如果你喜欢的话(。
节点之间的实际内存延迟很少像 ACPI 表声称的那样糟糕,至少从我的测试来看,http://www.codeblueprint.co.uk/2019/07/12/what-are-slit-tables.html。