NUMA架构入门

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的方式分为五大类:

  1. 操作系统忽略NUMA节点差异
    -> 操作系统不考虑NUMA节点的差异,将所有内存视为相同的方式处理。

    这种方式通常用于不需要NUMA优化的传统系统和小型应用程序。

  2. 硬件内存条纹化(Memory Striping in Hardware)
    -> 通过更改内存地址映射,在各个节点之间分散内存访问。

    优点是操作系统无需支持NUMA。但问题是缓存行可能会分布在多个NUMA节点上,因此始终需要使用远程内存。
    也就是说,强制使用互连会导致开销增加。

  3. 启发式内存分配(Heuristic Memory Placement)
    -> 操作系统识别NUMA并自动优化性能的方式。

    这通常是现代操作系统支持的功能。
    将进程运行节点的本地内存优先分配给该进程!

    不过,如果程序员错误地估算节点内的内存,则不可避免地需要使用远程内存。

  4. 操作系统为特定应用程序设置NUMA(Special NUMA Configuration for Applications)
    -> 操作系统提供选项,允许手动指定特定应用程序的NUMA内存分配。

    通过手动微调NUMA节点来调整性能。

  5. 应用程序直接控制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相关内容,如果有错误,请指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值