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 的内存上执行。