为Intel Core i7启用NUMA


22

在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节点时,具有的目的是什么?

Answers:


13

我认为这张图片足以说明问题:

                  在此处输入图片说明

  • 套接字或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

参考文献


2
@slm -你说的话是有道理的,但为什么内核文档(在我的问题引述)说我应该能CONFIG_NUMAcore i7
user1968963

1
自从Haswell以来,NUMA对于“单处理器”(即单插槽)计算机不再有用。某些Haswell产品具有Intel所说的“ Cluster on Die”模式。单个插槽处理器具有集成的多个内存控制器,因此具有多个内存路径,具有此功能的路径可被视为不同的NUMA区域,所有这些区域都包含一个插槽。
Paul Caheny 2015年

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

首先,请注意,英特尔酷睿i7只是一个市场名称,短语英特尔酷睿i7(或更高版本)非常模糊。那是什么意思呢?

Linux内核 Kconfig帮助文本编辑提到了Intel Core 7i,然后更正为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.

合理地讲,它只能指当时按规格发布或宣布的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(于2009年9月首次发布)或i3(于2010年1月首次发布)相对,但极有可能是新的Nehalem微体系结构与其集成的内存控制器和QPI。

从11/2008开始,英特尔在i7上发布了新闻稿(英特尔推出了星球上最快的处理器),其中说酷睿i7处理器的存储带宽是以前的英特尔“极限”平台的两倍以上,但根本没有提到NUMA。 。

我认为原因是NUMA与台式机无关,甚至对“极致”台式机也没有关系。

NUMA对于具有多个CPU插槽(而不是一个插槽中的多个内核)和专用物理内存访问通道(而不仅仅是一个内存控制器)的昂贵服务器非常重要,因此每个CPU都有其专用的本地内存,与它“更近”而不是其他CPU的内存。(请考虑使用8个插槽,64核,256 GB RAM。)NUMA表示,CPU不仅可以访问其自身的本地内存,而且还可以访问远程内存(另一个CPU的本地内存),尽管成本更高。NUMA是共享内存体系结构(例如SMP)和分布式内存体系结构(例如,MPP)的综合体,其中SMP共享所有内存对所有内核均可用,MPP(大规模并行处理)为每个节点提供专用的内存块。它是MPP,但对于应用程序来说看起来像SMP。

台式机主板没有双插槽,包括极速i7版本在内的Intel台式机CPU缺少用于双插槽配置的附加QPI链接。

查看Wikipedia QPI文章以了解QPI与NUMA的关系:

在单处理器主板上,最简单的形式是使用单个QPI将处理器连接到IO集线器(例如,将Intel Core i7连接到X58)。在体系结构更复杂的情况下,单独的QPI链接对连接主板上网络中的一个或多个处理器以及一个或多个IO集线器或路由集线器,从而允许所有组件通过网络访问其他组件。与HyperTransport一样,QuickPath体系结构假定处理器将具有集成的内存控制器,并启用非统一的内存访问(NUMA)体系结构。

[…]

尽管某些高端Core i7处理器公开了QPI,但其他用于单插槽板的“主流” Nehalem台式机和移动处理器(例如,Lynnfield / Clarksfield及其后续系列的LGA 1156 Core i3,Core i5和其他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回来查看此报告,以了解英特尔在i7上禁用了两个QPI链接之一,从而禁用了适用于NUMA的双路插槽配置:

Nehalem的第一个高端台式机实现的代号为Bloomfield,基本上与最终应用于两路服务器的芯片相同。因此,如上图所示,Bloomfield芯片具有两个板载QPI链接。但是,第二个QPI链接未使用。同样,在基于该体系结构的2P服务器中,第二个互连将链接两个套接字,并且在该套接字上,CPU将共享高速缓存一致性消息(使用新协议)和数据(因为内存子系统将为NUMA),这非常相似去Opteron。

因此,我一直在回避您有关我的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处理器,例如Xeon E5520


2

我认为,如果您使用--show开关,则可能更有意义:

$ numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 
cpubind: 0 
nodebind: 0 
membind: 0 

因此,您可以像这样控制physcpubind的使用:

$ numactl --physcpubind=+0-2 myapp

这会将应用程序限制为myapp前2个CPU内核。我的系统是具有4核的i5。

参考文献


2

在我自己构建内核的同时,我一直在为台式机研究相同的东西。经过大量研究,我决定禁用NUMA。我的CPU是Core i7 3820,它具有8个带HT的处理器。该页面帮助我做出了决定。

从配置文件禁用NUMA

总之,仅当您拥有1个以上的CPU插槽(不考虑内核)时,NUMA才值得。即使具有多个内核,在1个CPU套接字计算机上的处理能力也很少受到影响,但是这并不引人注目,因此大多数发行版都将其启用,因为它将为具有1个以上套接字的服务器和计算机带来巨大的好处。


1

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

您始终可以通过tasket(1)控制CPU绑定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.