为 Intel Core i7 启用 NUMA

为 Intel Core i7 启用 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.

我有一个 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 

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

答案1

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

首先,请注意英特尔酷睿 i7只是一个营销名称,短语英特尔酷睿 i7(或更高版本)很模糊。那么这意味着什么呢?

Linux 内核Kconfig帮助文本编辑提及英特尔酷睿7i, 然后更正为英特尔酷睿 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.

它只能合理地指当时按规格发布或宣布的 Intel Core i7 CPU。那将是布卢姆菲尔德处理器,基于Nehalem微架构,它将内存控制器从北桥移至 CPU(AMD 在 2003 年通过 Opteron/AMD64 完成了这项工作)并引入了QuickPath 互连/QPI(作为 AMD HyperTransport 的附属品)用于 CPU/CPU 和 CPU/IOH(IO 集线器,前北桥)互连。

Bloomdale i7 CPU 是新产品中的首批产品核心 i{3,5,7}命名方案。所以当 Linux 文档文本写完时,i7没有具体提到 Core i7,而不是 i5(首次于 09/2009)或 i3(首次于 01/2010),但很可能是指具有集成内存控制器和 QPI 的新 Nehalem 微架构。

英特尔于 2008 年 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 集线器(例如,将 Intel Core 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 年底,英特尔宣布其 Nehalem 和 Tukwila CPU 可兼容 x86 和 Itanium 服务器的 NUMA。这两个 CPU 系列共享一个通用芯片组;这种互连称为英特尔快速通道互连 (QPI)。AMD 使用 HyperTransport 在其 Opteron 处理器 (2003) 中实现了 NUMA。

检查这个11/2008 报告可以看到 Intel 禁用了 i7 上的两个 QPI 链路之一,从而禁用了适用 NUMA 的双插槽配置:

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

所以我一直在偏离你关于我的 Google 研究结果的问题……你问为什么 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 处理器,例如至强E5520

答案2

我想这张图已经足够说明问题了:

                  在此输入图像描述

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

  • 处理器核心(CPU 核心、逻辑处理器)是指能够执行计算的单个处理单元。

因此,上述情况表明您需要在计算机中使用多个处理器才能利用 NUMA 架构。

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

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

No NUMA configuration found
NUMA: Allocated memnodemap from b000 - b440

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

SMP: Allowing 1 CPUs, 0 hotplug CPUs
SMP: Allowing 32 CPUs, 0 hotplug CPUs

参考

答案3

当我自己构建内核时,我一直在为我的台式电脑研究同样的事情。经过大量研究后,我决定禁用 NUMA。我的 CPU 是 Core i7 3820,有 8 个带 HT 的处理器。此页面帮助我做出了决定。

从配置文件禁用 NUMA

总之,只有当您拥有超过 1 个 CPU 插槽(无论核心如何)时,NUMA 才值得。即使具有多个内核,1 个 CPU 插槽计算机上的处理能力也会受到很小的影响,但几乎不会被注意到,因此大多数发行版都会启用它,因为它将为具有超过 1 个插槽的服务器和计算机提供巨大的好处。

答案4

在一台最多有一个 CPU 的 PC 中,NUMA 完全没有用处。请随意在您自己的内核中禁用它。

您始终可以通过以下方式控制 CPU 绑定任务集(1)

相关内容