NUMA这种非统一内存访问架构,究竟有何独特之处?
摘要:什么是NUMA架构 简单来说,NUMA(Non-Uniform Memory Access,非统一内存访问架构) 是一种为了提高多处理器系统(多核 CPU)处理效率的内存设计方案。 在传统的架构中,所有处理器访问内存的速度是一样的;而在 N
什么是NUMA架构
简单来说,NUMA(Non-Uniform Memory Access,非统一内存访问架构) 是一种为了提高多处理器系统(多核 CPU)处理效率的内存设计方案。
在传统的架构中,所有处理器访问内存的速度是一样的;而在 NUMA 架构下,处理器访问“离自己近”的内存比访问“远程”内存要快得多。
1. 为什么会出现 NUMA?
在早期的 UMA(Uniform Memory Access) 架构中,所有的 CPU 都通过一根总线连接到同一个内存池。
痛点: 随着 CPU 核心数越来越多,大家都挤在这一根总线上抢带宽,就像十个人挤在一个狭窄的厨房里用一个水龙头,效率极低,这被称为“内存墙”问题。
2. NUMA 是如何工作的?
NUMA 将处理器和内存划分为多个节点(Node)。
本地访问(Local Access): 每个 CPU 都有自己“私有”的内存控制器和近端内存。CPU 访问这部分内存路径最短,延迟最低。
远程访问(Remote Access): 如果 CPU 需要的数据在另一个节点的内存里,它必须通过连接各节点的互联通道(如 Intel 的 QPI/UPI 或 AMD 的 Infinity Fabric)去“借”数据。
代价: 远程访问的延迟通常是本地访问的 2 倍甚至更高。
3. NUMA 的优缺点
特性
描述
优点
极大地扩展了系统的 CPU 核心数量;减轻了总线争用压力;提高了本地内存带宽。
缺点
访问延迟不一致。如果软件没优化(跨 Node 调取数据),性能反而会严重下降。
4. 实际应用中的“坑”
如果你在管理服务器(如 Linux 或 数据库),会经常遇到 “NUMA 陷阱”:
内存分配不均: 有时候 Node 0 的内存用光了,系统开始频繁进行 Swap(交换到磁盘),而 Node 1 还有大量空闲内存。这会导致系统突然变卡。
优化策略: * 绑核(Affinity): 让特定的程序只在某个 Node 的 CPU 上运行,并只使用该 Node 的内存。
策略调整: 使用 numactl 工具来查看节点状态,或通过 interleave 模式让内存均匀分布。
总结
NUMA 就像是把一个大办公室拆成了几个小隔间,每个员工(CPU)桌上都有自己的资料柜(内存)。拿自己柜里的东西很快,去隔壁同事柜里拿东西就得走两步。
怎么判断CPU是UMA 还是 NUMA
简单来说,判断一个 CPU 使用 UMA 还是 NUMA,主要取决于它的核心规模以及内存控制器的设计。
1. 使用 UMA 架构的 CPU
UMA (Uniform Memory Access) 常见于家用、消费级设备。在这种架构下,所有的核心距离内存的“物理距离”和“逻辑距离”都是相等的。
典型代表:
绝大多数桌面处理器: 比如 Intel Core i3/i5/i7/i9 系列(如最新的 Ultra 200 系列)和 AMD Ryzen 5/7/9 系列(如 9950X)。
笔记本处理器: 几乎所有主流笔记本 CPU。
早期服务器: 在多核竞赛开始之前的单路服务器。
特点: 结构简单,延迟恒定。虽然 AMD Ryzen 内部有多个 Chiplet(小芯片),但在逻辑层面上,它们通常被抽象为一个统一的内存池,用户感知不到延迟差异。
2. 使用 NUMA 架构的 CPU
NUMA (Non-Uniform Memory Access) 是为了解决多核心、多路服务器的“交通拥堵”而诞生的。
典型代表:
多路服务器系统: 当一台服务器插了两颗或四颗 Intel Xeon(至强)或 AMD EPYC(霄龙)处理器时,它们天然就是 NUMA 架构。CPU 0 访问插在 CPU 1 旁边的内存条就会变慢。
单颗高端服务器处理器: 现在的服务器 CPU 核心太多了(比如 AMD EPYC 的 128 核),为了提高效率,内部会将这 128 核划分为 4 个或更多的 NPS (Nodes Per Socket)。即使只插一颗 CPU,系统里也会显示有多个 NUMA 节点。
工作站处理器: 如 Intel Xeon-W 或 AMD Threadripper(线程撕裂者)。
特点: 扩展性极强,但需要操作系统和应用(如数据库)具备“NUMA 感知”能力,否则可能导致性能抖动。
