为 Intel Core i7 启用 NUMA

use*_*963 23 linux-kernel numa

在 Linux 内核中,文档CONFIG_NUMA说:

Enable NUMA (Non Uniform Memory Access) support. 

he kernel will try to allocate memory used by a CPU on the  
local memory controller of the CPU and add some more
NUMA awareness to the kernel.

For 64-bit this is recommended if the system is Intel Core i7
(or later), AMD Opteron, or EM64T NUMA.
Run Code Online (Sandbox Code Playgroud)

我有一个 Intel Core i7 处理器,但 AFAICT 它只有一个 NUMA 节点:

$ numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 16063 MB
node 0 free: 15031 MB
node distances:
node   0 
  0:  10 
Run Code Online (Sandbox Code Playgroud)

那么CONFIG_NUMA=y,当 i7 只有一个 NUMA 节点时,拥有的目的是什么?

Lum*_*umi 19

For 64-bit this is recommended if the system is Intel Core i7
(or later), AMD Opteron, or EM64T NUMA.
Run Code Online (Sandbox Code Playgroud)

首先,请注意Intel Core i7只是一个营销名称,Intel Core i7(或更高版本)这个词非常含糊。那么这意味着什么呢?

Kconfig提到Intel Core 7i的 Linux 内核帮助文本编辑,然后更正为Intel Core i7,是在 2008 年 11 月完成的。提交日志显示:

x86: update CONFIG_NUMA description
Impact: clarify/update CONFIG_NUMA text

CONFIG_NUMA description talk about a bit old thing.
So, following changes are better.

 o CONFIG_NUMA is no longer EXPERIMENTAL

 o Opteron is not the only processor of NUMA topology on x86_64 no longer,
   but also Intel Core7i has it.
Run Code Online (Sandbox Code Playgroud)

它可以合理地仅指当时根据规范发布或宣布的 Intel Core i7 CPU。那将是基于Nehalem 微架构Bloomfield处理器,它将内存控制器从北桥转移到 CPU(AMD 在 2003 年使用 Opteron/AMD64 完成)并引入了QuickPath Interconnect/QPI(作为 AMD HyperTransport 的附属)用于 CPU/CPU 和 CPU/IOH(IO 集线器,前北桥)互连。

Bloomdale i7 CPU 是新Core i{3,5,7}命名方案中的第一个条目。因此,在撰写该 Linux 文档文本时,i7并没有专门指代 Core i7,而不是 i5(首次于 09/2009)或 i3(首次于 01/2010),但很可能指的是新的 Nehalem 微体系结构它的集成内存控制器和 QPI。

2008 年 11 月 11 日,英特尔发布了关于 i7(英特尔推出地球上最快的处理器)的新闻稿,称酷睿 i7 处理器的内存带宽是之前英特尔“Extreme”平台的两倍多,但根本没有提到 NUMA .

原因是,我认为,NUMA 对台式电脑并不重要,甚至对“极端”电脑也不重要。

NUMA 对于具有多个 CPU 插槽(不仅仅是一个插槽上的多个内核)和专用物理内存访问通道(不仅仅是一个内存控制器)的昂贵服务器很重要,因此每个 CPU 都有其专用的本地内存,它“更接近”它与其他 CPU 的内存相比。(想想 8 个插槽、64 个内核、256 GB RAM。)NUMA 意味着 CPU 除了自己的本地内存之外还可以访问远程内存(另一个 CPU 的本地内存),尽管成本更高。NUMA 是 SMP 等共享内存架构的综合,其中所有内存对所有内核均等可用,以及分布式内存架构(如 MPP(大规模并行处理))为每个节点提供专用内存块。它是 MPP,但对于应用程序来说它看起来像 SMP。

台式机主板没有双插槽,英特尔台式机 CPU 包括极限 i7 版本缺少用于双插槽配置的额外 QPI 链接。

查看维基百科 QPI文章,了解 QPI 与 NUMA 的相关性:

在单处理器主板上,最简单的形式是使用单个 QPI 将处理器连接到 IO 集线器(例如,将英特尔酷睿 i7 连接到 X58)。在更复杂的架构实例中,单独的 QPI 链路对在主板上的网络中连接一个或多个处理器和一个或多个 IO 集线器或路由集线器,允许所有组件通过网络访问其他组件。与 HyperTransport 一样,QuickPath 架构假定处理器将具有集成内存控制器,并支持非统一内存访问 (NUMA) 架构。

[…]

尽管一些高端 Core i7 处理器公开 QPI,但其他“主流” Nehalem 台式机和移动处理器旨在用于单插槽主板(例如 LGA 1156 Core i3、Core i5 和来自 Lynnfield/Clarksfield 和后续系列的其他 Core i7 处理器)不要在外部公开 QPI,因为这些处理器不打算参与多插槽系统。但是,这些芯片内部使用 QPI […]

多插槽服务器主板上的 Intel Nehalem CPU 进行非本地内存访问的方式是通过 QPI。同样在关于 NUMA文章中

英特尔在 2007 年底宣布其 x86 和 Itanium 服务器与 Nehalem 和 Tukwila CPU 兼容 NUMA。两个 CPU 系列共享一个通用芯片组;这种互连称为 Intel Quick Path Interconnect (QPI)。AMD 通过其 Opteron 处理器 (2003) 使用 HyperTransport 实现了 NUMA。

查看 2008 年 11 月的这份报告,了解英特尔禁用了 i7 上的两个 QPI 链接之一,从而禁用了双插槽配置,其中 NUMA 应用:

Nehalem 的第一个高端桌面实现代号为 Bloomfield,它本质上与最终应该用于双插槽服务器的芯片相同。因此,Bloomfield 芯片带有两个板载 QPI 链接,如上图所示。但是,第二个 QPI 链接未使用。在基于这种架构的 2P 服务器中,第二个互连将连接两个套接字,通过它,CPU 将共享缓存一致性消息(使用新协议)和数据(因为内存子系统将是 NUMA)——同样,非常相似到皓龙。

所以我一直在偏离你关于我的谷歌研究结果的问题……你在问为什么 Linux 文档在 2008 年末开始建议打开它?不确定这个问题有一个可证明是正确的答案……我们必须问文档作者。开启 NUMA 不会使桌面 CPU 用户受益,但也不会显着伤害他们,同时帮助多插槽用户,为什么不呢?这可能是理由。发现反映在有关在 Arch Linux 跟踪器上禁用 NUMA 的讨论中(FS#31187 - [linux] - 从配置文件禁用 NUMA)。

文档作者可能也想到了Nehalem架构的NUMA潜力,在写文档的时候,11/2008 Core i7处理器(920、940、965)是唯一的代表;第一个 NUMA 真正有意义的 Nehalem 芯片可能是具有双 QPI 链接的 Q1/2009 Xeon 处理器,例如Xeon E5520


小智 15

我觉得这张图已经足够解释了:

                  在此处输入图片说明

  • socket 或 numa 节点是具有本地内存访问权限的内核集合。每个插槽包含 1 个或多个内核。请注意,这不一定是指物理插槽,而是指机器的内存架构,这取决于您的芯片供应商。

  • 处理器核心(cpu core,logical processor)是指能够进行计算的单个处理单元。

因此,以上表明您需要在机器中使用多个处理器来利用 NUMA 架构。

您可以在内核中编译 NUMA 支持并在单处理器机器上运行它。它类似于 SMP 支持。它也被编译,但是当内核检测到系统中有单个处理器时,它不会使用它(禁用它)。NUMA 也是如此。您可以检查dmesg内核环缓冲区或/var/log/dmesg文件以获取相关消息:

NUMA - 单处理器(或禁用 NUMA)X 多处理器:

No NUMA configuration found
NUMA: Allocated memnodemap from b000 - b440
Run Code Online (Sandbox Code Playgroud)

SMP - 单处理器 X 多处理器:

SMP: Allowing 1 CPUs, 0 hotplug CPUs
SMP: Allowing 32 CPUs, 0 hotplug CPUs
Run Code Online (Sandbox Code Playgroud)

参考

  • @slm - 你说的有道理,但为什么内核文档(在我的问题中引用)说我应该为 `core i7` 启用 `CONFIG_NUMA`? (2认同)
  • 由于 Haswell,NUMA 不再适用于“单处理器”(意为单插槽)机器。某些 Haswell 产品具有英特尔所谓的“芯片集群”模式。单插槽处理器集成了多个内存控制器,因此有多个内存路径,具有此功能的内存可被视为不同的 NUMA 区域,所有这些区域都包含一个插槽。 (2认同)