NUMA 的产生背景
在 NUMA 架构呈现前,CPU 欢快的朝着频率越来越高的方向倒退(纵向倒退)。受到物理极限的挑战,又转为核数越来越多的方向倒退(横向发展)。在一开始,内存控制器还在北桥中,所有 CPU 对内存的拜访都要通过北桥来实现。此时所有 CPU 拜访内存都是“统一的”,如下图所示:
这样的架构称为 UMA(Uniform Memory Access),直译为“对立内存拜访”,这样的架构对软件层面来说非常容易,总线模型保障所有的内存拜访是统一的,即每个处理器外围共享雷同的内存地址空间。但随着 CPU 外围数的减少,这样的架构不免遇到问题,比方对总线的带宽带来挑战、拜访同一块内存的抵触问题。为了解决这些问题,有人搞出了 NUMA。
留神:北桥芯片(North Bridge)是主板芯片组中起主导作用的最重要的组成部分,也称为主桥(Host Bridge)。一般来说,芯片组的名称就是以北桥芯片的名称来命名的,例如:英特尔 845E 芯片组的北桥芯片是 82845E,875P 芯片组的北桥芯片是 82875P 等等。
NUMA 构架细节
通过“NUMA 的产生背景”,让咱们理解到了之前内存拜访架构准则,与此绝对的就是 NUMA,NUMA 全称 Non-Uniform Memory Access,译为“非一致性内存拜访”。这种构架下,不同的内存器件和 CPU 外围隶属不同的 Node,每个 Node 都有本人的集成内存控制器(IMC,Integrated Memory Controller)。
在 Node 外部,架构相似 SMP,应用 IMC Bus 进行不同外围间的通信;不同的 Node 间通过 QPI(Quick Path Interconnect)进行通信,如下图所示:
一般来说,一个内存插槽对应一个 Node。须要留神的一个特点是,QPI 的提早要高于 IMC Bus,也就是说 CPU 拜访内存有了远近(remote/local)之别,而且试验剖析来看,这个差异非常明显。
在 Linux 中,对于 NUMA 有以下几个须要留神的中央:
默认状况下,内核不会将内存页面从一个 NUMA Node 迁徙到另外一个 NUMA Node;
然而有现成的工具能够实现将冷页面迁徙到近程(Remote)的节点:NUMA Balancing;
对于不同 NUMA Node 上内存页面迁徙的规定,社区中有仍然有不少争执。
NUMA 详细分析
非一致性内存架构 (Non-uniform Memory Architecture) 是为了解决传统的对称多解决 (Symmetric Multi-processor) 零碎中的可扩展性问题而诞生的。在对称多解决零碎中,处理器共享北桥中的内存控制器来达到独特拜访内部内存和 IO 的目标,也就是说所有的处理器对内存和 I / O 的拜访形式和开销都是雷同的。在这种零碎中,随着更多的处理器被增加到 SMP 零碎中,总线的竞争将会越来越大,零碎的性能也必将随之大打折扣。SMP 零碎的示意图如下:
本地节点:对于某个节点中的所有 CPU,此节点称为本地节点;(速度最快)
街坊节点:与本地节点相邻的节点称为街坊节点;(速度次之)
远端节点:非本地节点或街坊节点的节点,称为游戏远端节点。(速度最差)
超立方体能够作为一种无效的拓扑来形容 NUMA 零碎,它将零碎中的节点数限度在 2^C 内,C 是每个节点领有的街坊节点数,如下图所示
开销总结
以 C = 3 为例,则对于节点 1 而言,2,3,5 则为街坊节点,4,6,7,8 为远端节点,显然拜访开销的关系为 本地节点 < 街坊节点 < 远端节点。
NUMA 案例剖析
AMD Hyper-Transport
晚期的 SMP(对称多处理器零碎) 只领有一个位于北桥中的内存控制器,而现在更先进的做法是将内存控制器整合到 CPU 中去,这样每个 CPU 都领有本人的内存控制器,不会相互之间产生竞争。
最先采纳这种做法的一批处理器就是 AMD 在 2003 年推出的 AMD Opteron 系列处理器,其构造如下图所示:
每个 CPU 中都整合了一个内存控制器(IMC),并且 CPU 之间采纳了一种 Hyper-Transport 的技术建设连贯,这种连贯能够使得 CPU 通过其余 CPU 来拜访内部内存,当然拜访开销要比拜访本地内存更大。
操作系统的反对
为了反对 NUMA 架构,OS 的设计必须将内存散布的特点思考进去。
举一个简略的例子,如果一个过程运行在一个给定的处理器中,那么为这个过程所调配的物理内存就应该是该处理器的本地内存,而不是内部内存。
OS 还要留神防止将一个过程从一个节点给迁徙到另一个节点。在一个一般的多解决零碎中,OS 就应该曾经尝试不去在处理器之间迁徙过程,因为这意味着一个处理器的 cache 中的相干内容都将被失落。如果在某种状况下必须进行迁徙,那么 OS 能够随便抉择一个闲暇的处理器。
然而在 NUMA 零碎中,可抉择在 www.cungun.com 抉择新的处理器将要受到一些限度,最重要的一点就是新处理器拜访内存的开销不能比先前的处理器大,也就是说应该尽可能抉择本地节点中的处理器。
当找不到符合条件的处理器,OS 能力抉择其余类型的处理器。
在这种较糟的状况下有两种抉择:
如果过程只是暂时性的被迁徙进来,能够再将其迁徙回更加适合的处理器;
如果不是暂时性的,那么能够将该过程的内存拷贝到新处理器的内存中,这样就能够通过拜访拷贝的内存来打消拜访内部内存的开销,显然这是一种空间换工夫的做法。
NUMA Node 操作
NUMA Node 调配
有两个 NUMA Node,每个节点治理 16GB 内存。
NUMA Node 绑定
Node 和 Node 之间进行通信的代价是不等的,同样是 Remote 节点,其代价可能不一样,这个信息在 node distances 中以一个矩阵的形式展示。
咱们能够将一个过程绑定在某个 CPU 或 NUMA Node 的内存上执行。