NUMA 节点的数量总是等于套接字的数量吗?

NUMA 节点的数量总是等于套接字的数量吗?

我曾经lscpu检查过两台服务器的配置:

[root@localhost ~]# lscpu
Architecture:          x86_64
......
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 26

另一个:

[root@localhost Packages]# lscpu
Architecture:          x86_64
.....
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 45

所以我想知道 NUMA 节点的数量是否实际上总是等于套接字数量。有没有它们不相等的例子?

答案1

您为什么想知道 NUMA 节点的数量? 重要的部分是 NUMA 拓扑,它说明了这些“节点”是如何连接的。

我检查了几个系统,包括由 4 个互连的 2 插槽刀片(Hitachi Compute Node 2000)组成的 8 插槽(10 核 CPU)系统。此外,这里的 NUMA 节点数等于 CPU 插槽数(8)。这取决于 CPU 架构,主要是其内存总线设计。

整个 NUMA(非统一内存访问)定义了每个逻辑 CPU 如何访问内存的每个部分。当您拥有 2 个插槽系统时,每个 CPU(插槽)都有自己的内存,可以直接访问。但它还必须能够访问另一个插槽中的内存 - 这当然比访问本地内存需要更多的 CPU 周期。NUMA 节点指定系统内存的哪一部分是哪个 CPU 的本地内存。您可以拥有更多层拓扑,例如在 HP Superdome 系统(使用 Intel Itanium2 CPU)的情况下,您有本地 CPU 插槽内存,然后是同一单元内不同插槽上的内存,然后是其他单元中的内存(具有最高的延迟)。

您可以配置系统中的 NUMA,以便为您的工作负载提供最佳性能。例如,您可以允许所有 CPU 访问所有内存,或者仅访问本地内存,这将改变 Linux 调度程序在可用逻辑 CPU 之间分配进程的方式。如果您有许多不需要太多内存的进程,那么仅使用本地内存可能会有好处,但如果您有大量进程(Oracle 数据库及其共享内存),在所有 CPU 之间使用所有内存可能会更好。

numastat您可以使用或等命令numactl --hardware检查系统上的 NUMA 状态。以下是该 8 插槽机器的信息:

hana2:~ # lscpu
Architecture:          x86_64
CPU(s):                160
Thread(s) per core:    2
Core(s) per socket:    10
CPU socket(s):         8
NUMA node(s):          8
NUMA node0 CPU(s):     0-19
NUMA node1 CPU(s):     20-39
NUMA node2 CPU(s):     40-59
NUMA node3 CPU(s):     60-79
NUMA node4 CPU(s):     80-99
NUMA node5 CPU(s):     100-119
NUMA node6 CPU(s):     120-139
NUMA node7 CPU(s):     140-159

hana2:~ # numactl --hardware
available: 8 nodes (0-7)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
node 0 size: 130961 MB
node 0 free: 66647 MB
node 1 cpus: 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
node 1 size: 131072 MB
node 1 free: 38705 MB
node 2 cpus: 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
node 2 size: 131072 MB
node 2 free: 71668 MB
node 3 cpus: 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
node 3 size: 131072 MB
node 3 free: 47432 MB
node 4 cpus: 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
node 4 size: 131072 MB
node 4 free: 68458 MB
node 5 cpus: 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
node 5 size: 131072 MB
node 5 free: 62218 MB
node 6 cpus: 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
node 6 size: 131072 MB
node 6 free: 68071 MB
node 7 cpus: 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
node 7 size: 131008 MB
node 7 free: 47306 MB
node distances:
node   0   1   2   3   4   5   6   7
  0:  10  21  21  21  21  21  21  21
  1:  21  10  21  21  21  21  21  21
  2:  21  21  10  21  21  21  21  21
  3:  21  21  21  10  21  21  21  21
  4:  21  21  21  21  10  21  21  21
  5:  21  21  21  21  21  10  21  21
  6:  21  21  21  21  21  21  10  21
  7:  21  21  21  21  21  21  21  10

您可以在此处看到每个 NUMA 节点(CPU 插槽)中存在的内存量以及已使用和空闲的内存量。

最后一部分显示了 NUMA 拓扑 - 它显示了各个节点之间在内存访问延迟方面的“距离”(这些数字只是相对的,它们不代表毫秒或其他任何时间)。在这里,您可以看到本地内存的延迟(节点 0 访问 0 中的内存,节点 1 访问 1 中的内存,...)为 10,而远程延迟(节点访问其他节点上的内存)为 21。虽然此系统由 4 个单独的刀片组成,但同一刀片或其他刀片上的不同插槽的延迟是相同的。

关于 NUMA 的有趣文档也可以在RedHat 门户

答案2

不是。NUMA 节点数并不总是等于插槽数。例如,AMD Threadripper 1950X 有 1 个插槽和 2 个 NUMA 节点,而双 Intel Xeon E5310 系统可以显示 2 个插槽和 1 个 NUMA 节点。

答案3

其实不是。在我的服务器上:

➜ lscpu
Socket(s):             2
NUMA node(s):          4
NUMA node0 CPU(s):     0-31,128-159
NUMA node1 CPU(s):     32-63,160-191
NUMA node2 CPU(s):     64-95,192-223
NUMA node3 CPU(s):     96-127,224-255

在我的服务器上,NUMA 节点 0 和节点 1 位于插槽 0,其余两个位于插槽 1。

相关内容