NUMA是什么?
NUMA是Non-Uniform Memory Access(非统一内存访问)的缩写,
它指的是一种架构,在这种架构中,每个处理器访问内存的速度并不相同。
每个处理器可以快速访问与其物理上接近的本地内存(Local Memory),但访问其他处理器的远程内存(Remote Memory)时速度会相对较慢。
过去的多处理器系统基于对称多处理(Symmetric Multi-Processing, SMP)或统一内存架构(Uniform Memory Architecture, UMA)设计,
在这种设计中,所有处理器共享单一内存池,因此会出现总线带宽和缓存一致性(Coherency)问题,导致性能瓶颈。
NUMA通过为每个处理器提供本地内存,并仅在必要时访问远程内存,解决了这些问题,是一种高度可扩展的架构。
(顺便提一下,这种解决缓存一致性问题的NUMA架构也被称为Cache-Coherent NUMA,即ccNUMA)。
在大规模系统中,NUMA在扩展性和性能方面更具优势,但在小型系统中,UMA可能更高效。
那么,为了更好地理解NUMA,建议参考以下内容:
简单总结一句话!
- 处理器(Processor) :执行指令并进行运算的设备。
- 本地内存(Local Memory) :直接连接到处理器的内存 -> 可以快速访问!
- 远程内存(Remote Memory) :属于其他NUMA节点的内存,需通过互连(Interconnect)访问 -> 相对较慢!
- 互连(InterConnect) :用于在NUMA节点之间传输数据的链路,在访问远程内存时会产生延迟。
这是Christoph Lameter的《An Overview of Non-Uniform Memory Access (NUMA)》论文。
在阅读本文之前,需要了解NUMA节点的概念:
在NUMA中,节点(Node) 指的是一个CPU插槽及其连接的内存块。
这篇论文主要分为两大部分:操作系统中的NUMA内存管理方式和NUMA内存策略(Memory Policies)。但在那之前,我们需要了解NUMA节点的概念。
(NUMA架构 - Intel官网来源)
一个NUMA节点 = CPU + 本地内存 + 内存控制器
- 每个NUMA节点可以快速访问自己的内存,但访问其他NUMA节点的内存时速度较慢。
也就是说,NUMA架构将单一内存池划分为多个称为“节点”的部分进行管理!
(具有两个NUMA节点和八个处理器的系统示例)
操作系统如何处理NUMA?
本文将操作系统处理NUMA的方式分为五大类:
-
操作系统忽略NUMA节点差异
-> 操作系统不考虑NUMA节点的差异,将所有内存视为相同的方式处理。这种方式通常用于不需要NUMA优化的传统系统和小型应用程序。
-
硬件内存条纹化(Memory Striping in Hardware)
-> 通过更改内存地址映射,在各个节点之间分散内存访问。优点是操作系统无需支持NUMA。但问题是缓存行可能会分布在多个NUMA节点上,因此始终需要使用远程内存。
也就是说,强制使用互连会导致开销增加。 -
启发式内存分配(Heuristic Memory Placement)
-> 操作系统识别NUMA并自动优化性能的方式。这通常是现代操作系统支持的功能。
将进程运行节点的本地内存优先分配给该进程!不过,如果程序员错误地估算节点内的内存,则不可避免地需要使用远程内存。
-
操作系统为特定应用程序设置NUMA(Special NUMA Configuration for Applications)
-> 操作系统提供选项,允许手动指定特定应用程序的NUMA内存分配。通过手动微调NUMA节点来调整性能。
-
应用程序直接控制NUMA(Application-Controlled NUMA Allocations)
-> 应用程序不遵循操作系统的默认NUMA策略,而是直接指定内存分配。应用程序直接管理NUMA意味着性能的提升或下降取决于程序员的能力。
本文主要通过Linux命令解释NUMA内存策略和管理方式,
但作者仅提取了基本概念进行说明。
NUMA内存策略与管理方式
-
NODE LOCAL(节点本地)
-> 进程优先从当前CPU节点的内存中分配,这是最基本的方式。 -
INTERLEAVE(交错)
-> 以轮询方式将内存分配到多个节点。 -
Reclaim(内存回收)
-> 在内存不足时释放未使用的页面。
什么是页面(Page)?
页面是操作系统管理内存的最小单位。
当进程分配内存时,操作系统以“页面”为单位进行管理。
通常页面大小约为4KB(4096字节)。
本文主要介绍Linux中的NUMA管理方法,
但Windows也在微软学习中心和各种书籍中提供了NUMA概念和API。
一般来说,Windows和Linux在NUMA上的区别如下:
操作系统 | Linux | Windows |
---|---|---|
NUMA策略应用 | numactl内核设置 | Windows API (GetNumaNodeProcessorMask) |
默认内存策略 | NODE LOCAL(默认) INTERLEAVE(内核) | NODE LOCAL |
NUMA感知调度器 | 支持NUMA感知的CPU和内存分配 | 支持NUMA感知调度 |
作为一名初学者,我整理了NUMA相关内容,如果有错误,请指出!