NUMA 原理
NUMA(Non-Uniform Memory Access,非一致性内存访问)
是一种多处理器架构,它将系统中的内存分成多个节点,并将每个节点分配给不同的处理器。在 NUMA 架构中,每个处理器可以访问本地节点的内存,但访问远程节点的内存速度较慢。因此,NUMA 架构可以提高多处理器系统的性能和可扩展性。
NUMA 架构的原理是将系统内存划分为多个节点,并将每个节点分配给不同的处理器。每个节点都有自己的内存控制器和本地内存,处理器可以直接访问本地节点的内存,而访问远程节点的内存则需要通过互连网络进行访问。由于访问本地节点的内存速度快,因此 NUMA 架构可以提高系统的性能和可扩展性。
在 NUMA 架构中,内存访问的速度取决于处理器和内存节点之间的距离。如果处理器和内存节点距离较近,则内存访问速度快;如果处理器和内存节点距离较远,则内存访问速度慢。因此,为了提高系统的性能,需要将任务分配到距离处理器较近的节点上,以便利用本地内存和缓存。
NUMA原理解读
现在的计算机系统通常包含多个CPU和多个内存块。以前,我们通常将所有内存看作是一块共享内存,所有处理器对共享内存的访问方式都是相同的,这就是之前普遍使用的SMP模型。但是随着处理器数量的增加,共享内存可能会导致内存访问冲突变得更加严重,并且当内存访问达到瓶颈时,性能将无法继续提高。为了解决这个问题,引入了NUMA(非一致性内存访问)模型。
在NUMA模型中,系统内存被分成多个节点,每个节点被分配给不同的处理器。例如,如果一个系统有2个处理器和4个内存模块,我们将其中一个处理器和两个内存块组合成一个NUMA节点,这样系统就有两个NUMA节点。在物理分布上,处理器和内存模块的物理距离更近,因此访问速度更快。
bash
[root@node ~]# numastat
node0 node1
numa_hit 4336472823 4014464277
numa_miss 0 0
numa_foreign 0 0
interleave_hit 39269 39165
local_node 4335920642 4014136308
other_node 552181 327969
例如,在这个系统中,处理器被分布在左右两侧(cpu1,cpu2),每个处理器两侧都有两个内存模块(memory1.1,memory1.2,memory2.1,memory2.2)。因此,对于NUMA节点1的cpu1来说,访问memory1.1和memory1.2比访问memory2.1和memory2.2更快。因此,使用NUMA模型时,如果能够确保本节点内的处理器只访问本节点内的内存模块,则可以获得最高的效率。
NUMA 开关对性能的影响
todo
总结来说是:根据具体业务决定NUMA的使用
查询节点 NUMA 开关的方式
使用lscpu命令来查看系统的CPU架构信息,如果系统的CPU架构支持NUMA,则该命令的输出中 available nodes
≥2。
方法一:numactl --hardware
bash
[root@node ~]# numactl --hardware
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 32 33 34 35
node 0 size: 257285 MB
node 0 free: 253410 MB
node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 36 37 38 39 40 41 42 43 44 45 46 47
node 1 size: 257272 MB
node 1 free: 247980 MB
node distances:
node 0 1
0: 10 21
1: 21 10
输出结果解析:
-
available: 2 nodes (0-1)
表示系统中有2个NUMA节点,编号分别为0和1,表示 NUMA 处于开启状态。若返回信息中 NUMA 节点数为1,即available: 1 nodes (0)
,则 NUMA 处于关闭状态。 -
node 0 cpus
和node 1 cpus
列出了每个节点上的CPU列表。每个CPU的编号表示该CPU在系统中的实际编号,CPU列表中的奇数编号表示该CPU所在的核心,偶数编号表示该核心上的线程。 -
node 0 size
和node 1 size
列出了每个节点的内存总大小,单位为MB。 -
node 0 free
和node 1 free
列出了每个节点的可用内存大小,单位为MB。 -
node distances
列出了节点之间的距离矩阵。例如,第一行表示节点0到节点0的距离为10,节点0到节点1的距离为20;第二行表示节点1到节点0的距离为20,节点1到节点1的距离为10。距离矩阵的值越小,表示两个节点之间的距离越近。
实践对比:
方法二:lscpu
bash
[root@node ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 48
On-line CPU(s) list: 0-47
Thread(s) per core: 2
Core(s) per socket: 12
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Model name: Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz
Stepping: 2
CPU MHz: 2633.525
CPU max MHz: 2301.0000
CPU min MHz: 1200.0000
BogoMIPS: 4589.07
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 30720K
NUMA node0 CPU(s): 0-11,24-35
NUMA node1 CPU(s): 12-23,36-47
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti intel_ppin tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm ida arat pln pts
输出结果解析:
-
NUMA node(s): 2
表示系统中有2个 NUMA 节点,表示 NUMA 处于开启状态。若返回信息中 NUMA 节点数为1,则 NUMA 处于关闭状态。 -
0-23,48-71
和24-47,72-95
表示每个 NUMA 节点中的 CPU 编号范围。 -
在这个示例中,系统中有两个 NUMA 节点,其中
NUMA node0
中包含了编号为0-23
和48-71
的 CPU,而NUMA node1
中包含了编号为24-47
和72-95
的 CPU。
实践对比: