目录1. 传统的 SMP 架构2. NUMA 架构2.1 架构图2.2 问题3. 为什么我们开发者要关心 NUMA4 如何在 Linux 上观察 NUMA 信息NUMANon-Uniform Memory Access非统一内存访问是一种现代计算机架构设计主要用于多处理器系统。它的核心思想是将内存划分为多个区域NUMA 节点每个区域与特定的处理器或处理器组相关联。这样可以优化内存访问性能特别是在大规模服务器和高性能计算环境中。1. 传统的 SMP 架构在传统的 SMP对称多处理架构中所有 CPU 共享同一块内存。内存通过总线连接到所有 CPU 核心。每个 CPU 访问内存的延迟是相同的。问题当 CPU 数量增加时总线竞争会导致性能瓶颈。内存带宽成为限制系统扩展性的关键因素。2. NUMA 架构2.1 架构图随着CPU多核技术的发展一颗物理CPU中集成了越来越多的 core会导致传统SMP架构的性能瓶颈越来越明显因为所有的处理器都通过一条总线连接起来因此随着处理器的增加系统总线成为了系统瓶颈另外处理器和内存之间的通信延迟也较大。为了解决传统 SMP架构下因为增多的CPU Core 而导致的性能问题NUMA架构应运而生。NUMA 是现代高端服务器、多路多CPU插槽主板的标准设计架构图解析将 CPU 核心和一部分内存连同它自己的内存控制器组合成一个“节点”Node。例如一台双路服务器有两个 CPU 插槽就组成了两个 NUMA 节点。每个节点有自己的本地内存。节点之间通过高速的“互联通道”连接Intel 叫 QPI/UPIAMD 叫 Infinity Fabric。特点本地内存 (Local)CPU 核心访问自己节点内的内存速度非常快。远程内存 (Remote)CPU 核心访问其他节点的内存速度要慢得多需要跨互联通道。项目SMPUMANUMA全称Symmetric Multi-Processor对称多处理Non-Uniform Memory Access非统一内存访问内存组织集中式全局内存分布式每个节点有本地内存访问延迟所有 CPU 一致本地快、跨节点慢互联方式单一总线节点间高速互联QPI/UPI扩展性差4 核性能陡降好支持多路 / 高密度核心典型场景PC、笔记本、老服务器、VM主流 2/4 路服务器、数据库、高并发服务调优重点无特殊 NUMA 调优进程 / 线程绑节点、内存亲和2.2 问题1. Core 是什么与 CPU中央处理器是什么关系一个Core核心是 CPU 内部的一个完整、独立的处理单元能够取指令Instruction Fetch解码并执行指令进行算术和逻辑运算ALU 操作访问寄存器和缓存每个核心都可以独立运行一个或多个线程通过超线程技术处理自己的任务。✅ 举例一个四核处理器4-core CPU意味着它内部有四个独立的核心可以同时运行四个不同的任务。概念说明CPUCentral Processing Unit中央处理器是计算机的“大脑”负责执行程序和控制整个系统。Core核心是 CPU 内部的实际运算单元。现代 CPU 通常包含多个核心。CPU 至少一个 Core 共享组件缓存、总线接口、电源管理等单核 CPU1 个核心多核 CPU2 个或更多核心如双核、四核、八核、甚至上百核如服务器芯片多核的优势并行处理多个任务可以同时运行在不同核心上。提高性能尤其在多任务、视频渲染、科学计算、游戏等场景下表现更佳。节能优化轻负载时关闭部分核心以省电。3. 为什么我们开发者要关心 NUMA对 NUMA 理解的深入可以促进我们开发出性能更优的程序。NUMA 的影响主要在多线程、高性能服务端程序的优化上。性能问题如果操作系统把线程调度到一个 CPU 核心但该线程访问的内存放在另一个 NUMA 节点上就会产生大量的远程内存访问拖慢执行速度。资源利用如果程序设计不好可能导致某些节点的内存耗尽频繁交换而其他节点内存空闲整体性能反而下降。C 中的应对策略NUMA 感知的内存分配使用libnuma库提供的 API如numa_alloc_onnode在程序里手动指定内存分配在哪个 NUMA 节点上。CPU 亲和性 (CPU Affinity)使用pthread_setaffinity_np或sched_setaffinity把线程“绑”在指定的 CPU 核心上并确保它使用的内存在同一个节点。基础库支持Intel 的 TBB (Threading Building Blocks) 和 OneAPI 等框架内部已经做了 NUMA 感知的内存分配器。4 如何在 Linux 上观察 NUMA 信息大部分 Linux 发行版都提供了numactl工具。# 查看系统的 NUMA 架构信息 numactl --hardware # 示例输出双路 AMD EPYC 服务器 available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 24 25 26 27 28 29 30 31 node 0 size: 64218 MB node 0 free: 15234 MB node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 36 37 38 39 40 41 42 43 node 1 size: 64492 MB node 1 free: 22893 MB node distances: node 0 1 0: 10 21 1: 21 10解读这个输出available: 2 nodes这台服务器有两个 NUMA 节点。node 0 cpus属于节点 0 的 CPU 核心列表。node 0 size节点 0 上的物理内存大小。node distances相对访问成本矩阵值越小越快。10是本地访问延迟基准21表示节点 0 访问节点 1 的内存延迟大约是本地访问的 2.1 倍。