OS 在有多个控制器的服务器中分配内存时是否选择内存控制器?如何?

Does an OS choose a memory controller when allocating memory in a server with multiple controllers? How?

许多来自 Intel 和 AMD 的较新的多核服务器在每个插槽上都配备了多个 DRAM 内存控制器。 (与使用一个双通道控制器的 desktops/laptops 相比。)

当 OS(比如说 Linux)需要内存来为应用程序的请求提供服务时,如何选择一个 DRAM 控制器来为请求提供服务?我看到三种可能性:

  1. Linux 使用某种算法选择它。
  2. 硬件的连接方式使得特定核心将使用特定内存控制器。
  3. 做出此决定的还有第三个组成部分。

我还没有找到任何确定的答案。

很确定连续的物理内存在 socket/package 中跨控制器交错,因此单个顺序读取流将分布在所有控制器上。

(L3 未命中是在决定向内存控制器发送请求时,因此 L3 切片中的逻辑大概知道如何通过环形总线或网格(英特尔)将流量定向到适当的内存控制器或AMD最近使用的任何互连。可能基于缓存行地址的某些功能,尽管控制器数量不是2的幂,缓存行到控制器的循环分配可能需要一个分隔符?那会令人惊讶。)

BIOS/firmware 可以配置,也许用菜单选项来控制。

只有在每个物理插槽都有一些内存控制器的多插槽服务器中,OS才会参与/知道它在哪个插槽上分配内存。 (NUMA 本地与远程,因此本地插槽上的内核的内存会更快。)

默认情况下,Linux 对内存使用“首次接触”分配策略——新实例化的页面将位于与进行访问的内核相同的 NUMA 域中。如果所需 NUMA 节点上没有可用内存,将从另一个 NUMA 节点分配。

BIOS 配置内存控制器到 NUMA 节点的映射(OS 然后从 BIOS 提供的表中读取)。

可以使用 NUMA 分配 API 或使用“numactl”可执行文件更轻松地修改或覆盖默认分配策略。可用的策略包括“membind”(强制在特定 NUMA 节点上分配内存或中止)、“preferred”(与默认值基本相同,但阻止自动 NUMA 页面迁移)和“interleave”(在指定的节点上交错页面一组 NUMA 节点号)。

最近的 Linux 内核支持自动 NUMA 页面迁移。启用后,OS 会监控对用户页面的访问,如果它们主要由来自不同 NUMA 节点的核心访问,则页面将移动到该节点。这实际上效果出奇地好。