目录

NUMA Underpinning

图片无法显示,请右键点击新窗口打开图片

在早期的计算机,其采用单处理器架构,即一个 CPU 只有一个物理核,并且主板上只有插一块 CPU Package. 随着技术的进步,主板上可以插入更多的 CPU package,这是 CPU 内部依旧是单物理核结构,多处理器系统的出现,它们能够同时处理多个任务,显著提高了计算效率. 最初这些多处理器系统采用的是对称多处理(SMP)架构,所有的处理器共享同一块内存资源,每个处理器都可以平等地访问所有的内存,比如典型的 Intel i440FX 架构,所有的处理器共享系统总线(FSB).

图片无法显示,请右键点击新窗口打开图片

在这种架构下,内存控制器和内存并没有集成到 CPU 内部,CPU 访问内存需要通过共享总线(FSB) 经由内存控制器(PMC) 才能访问到物理内存, 可以看到所有处理器访问内存的距离都是一样的,因此称这类架构为统一内存访问架构(Uniform Memory Access: UMA). 在 UMA 架构下,所有处理器(CPU) 访问内存的延迟(Latency)是一致的.

图片无法显示,请右键点击新窗口打开图片

然而,随着处理器核心数量的增长,SMP 架构暴露出了性能瓶颈, 其中 FSB 共享总线带宽影响最明显,Intel 为此不断改进,引入了双独立共享总线(Dual Independent Buses: DIB)和基于高速互联(Dedicated High-Speed Interconnects: DHSI) 的四独立共享 FSB 总线. 但竞争对手 AMD 推出的 HyperTransport 总线直接取消了北桥,将内存控制器集成到 CPU 内部, 大大降低了多核芯带来的性能瓶颈,Intel 随后也将内存控制器集成到 CPU 内部, 至此共享总线模式退出舞台.

图片无法显示,请右键点击新窗口打开图片

X86 将内存控制器集成到 CPU 内部之后,Intel 尽可能提高 CPU 频率来提升性能,受限于工艺和技术,提升频率有一定的限度,于是提出拼核心数来提升性能,早期的拼核心数的方式是在主板上加入更多的 Socket,让多个处理器通过 QPI 总线互联. 每个 Socket 都有自己的内存控制器,内存控制器连接内存条(DIMM). 由于 QPI 总线互联模式的出现,处理器可以访问本 Socket 内部的内存,也需要跨 Socket 去访问其他 Socket 的内存. X86 顺势推出了非一致性内存访问(Non-uniform Memory Access: NUMA)架构, 在 NUMA 架构下,将一个 Socket 称为一个独立的 NUMA 节点(NUMA NODE), 本 Socket 的内存称为本地内存(Local Memory), 而需要跨 NUMA 才能访问到的内存称为远端内存(Remote Memory).

图片无法显示,请右键点击新窗口打开图片

随机架构进一步演进,Die 内被塞入更多的物理核,物理核之间通过 RingBus 总线连接在一起,该总线与 FSB 共享总线类似,每个 Ring 上连接一个内存控制器,这条总线也被称为 IMC Bus. 但随着 Die 内存塞入的物理核越来越多,为了保证延迟,一个 Ring 已经不够用,于是出现了 1.5 个 Ring 和 2 个 Ring 的架构,多出来的 Ring 也连接到一个内存控制器里,因此一个 Package 里出现了两个内存控制器的情况. CPU 不仅跨 Socket 访问远端内存会带来性能损耗,Die 内的物理核跨 Ring 访问内存控制器也会有一定的性能损耗.

图片无法显示,请右键点击新窗口打开图片

以 Intel Xeon 2600 V4 系列 CPU 来看,两个 Socket 之间通过各自一条 9.6GT/s 的 QPI 总线互联. 每个处理器内部具有两个内存控制器,并且每个内存控制器有两个内存通道(Channel), 每个内存通道最多支持 3 根内存条(DIMM). 理论上 Socket 支持 76.8GB/s 的内存带宽,而两个 QPI link,每个 QPI link 有 9.6GT/s(~57.6GB/s) 的速率,如果跨 Socket 访问,那么 QPI link 已经出现了瓶颈.

图片无法显示,请右键点击新窗口打开图片

随着 Die 内核心数的不断增多,RingBus 已经称为了性能瓶颈,在 Intel Xeon Skylake 引入了 Mesh 总线. 由于这种架构的变化,导致内存的访问变得更加复杂. 在 Mesh 总线上,每个节点的维度(连接数量)为 2、3 或者 4,相邻节点称为一跳(Hop), 两个节点之间 Hop 个数称为跳数(Hop Count),每一跳都需要消耗时间,两个节点之间的跳数越少,延迟越低. 因此在 Mesh 总线架构里,两个 IMC(内存控制器) 也有了 Local/Remote 的区别,在保证兼容性的前提和性能导向的纠结中,系统允许用户进行更灵活的内存访问架构划分, 因此 “NUMA 之上的 NUMA” 的 SNC(Sub-NUMA Clustering) 概念孕育而生.

图片无法显示,请右键点击新窗口打开图片

为了提升 Socket 之间的互联效率,QPI 总线升级为 UPI 总线,其可以提供高达 10.4GT/s(QPI 9.6GT/s), 约为 41.6GB/s, 这对跨 Socket 的内存访问是有益的. 以上便是 NUMA 的基本原理,在分析 NUMA 性能优化时,应该基于实际的 CPU 架构进行优化,后续的内容将对 Intel 和 AMD 进行详细的分析.