1. NUMA 拓扑中 CPU、内存节点(node)与互连的关系是什么,为什么数据库与 JVM 需要 NUMA 感知?
在 NUMA 拓扑中,CPU、内存节点(node)与互连(interconnect)的关系是什么,为什么数据库与 JVM 需要 NUMA 感知?
- NUMA 的 CPU 与内存节点绑定
- 本地/远程访存的差异
- 数据库与 JVM 的 NUMA 感知需求
在 NUMA 架构中,系统被划分为多个 node,每个 node 包含一组 CPU 核与一段本地内存,CPU 访问本 node 内存(本地访问)延迟低、带宽高,访问其他 node 的内存(远程访问)需经过互连(如 UPI、QPI、CXL 等)转发,延迟更高、带宽更低且可能争用互连带宽。因此"数据在哪个 node 上、由哪个 node 的 CPU 访问"直接决定性能。数据库与 JVM 需要 NUMA 感知是因为:它们通常持有大内存区(如 buffer pool、JVM 堆),若这些内存被远程访问,会显著增加延迟、降低吞吐;此外它们内部有大量并发线程与分区结构,通过 NUMA 感知(把内存绑定到执行线程所在 node、把 hot 数据放本地)能最大化本地命中率、减少跨 node 访问,从而提升性能。这也解释了为什么大型数据库/JVM 部署常配合 numactl、内存绑定与 NUMA-aware 的内存分配策略。
NUMA 的本质是"访存延迟与带宽受 node 位置影响",数据库与 JVM 的大内存、高并发特性放大了这种影响,因此需要显式 NUMA 感知来布局数据与线程。