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 노드의 양이 항상 소켓과 같은지 궁금합니다. 그들이 같지 않은 예가 있습니까?



답변

NUMA 노드 수에 대해 왜 궁금하십니까? 중요한 부분은 NUMA 토폴로지인데, “노드”가 어떻게 연결되어 있는지 알려줍니다.

4 개의 상호 연결된 2 소켓 블레이드 (Hitachi Compute Node 2000)로 구성된 8 소켓 (10 코어 CPU) 시스템을 포함한 몇 가지 시스템을 확인했습니다. 또한 여기서 NUMA 노드의 수는 CPU 소켓 수 (8)와 같습니다. 이것은 주로 메모리 버스 디자인 인 CPU 아키텍처에 따라 다릅니다.

전체 NUMA (비 균일 메모리 액세스)는 각 논리 CPU가 메모리의 각 부분에 액세스하는 방법을 정의합니다. 소켓 시스템이 2 개인 경우 각 CPU (소켓)에는 자체 액세스 할 수있는 자체 메모리가 있습니다. 그러나 다른 소켓의 메모리에도 액세스 할 수 있어야합니다. 물론 로컬 메모리에 액세스하는 것보다 더 많은 CPU주기가 필요합니다. NUMA 노드는 시스템 메모리의 어느 부분이 어떤 CPU에 로컬인지 지정합니다. 예를 들어 Intel Itanium2 CPU를 사용하는 HP Superdome 시스템의 경우 더 많은 토폴로지 계층을 가질 수 있으며 로컬 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 토폴로지를 보여줍니다-메모리 액세스 대기 시간 측면에서 개별 노드 사이의 “거리”를 보여줍니다 (숫자는 상대적이며 시간은 ms 또는 기타로 표시되지 않습니다). 여기에서 로컬 메모리 (노드 0은 0의 메모리에 액세스하고 1의 노드 1은 …)에 대한 대기 시간이 10 인 반면 원격 대기 시간 (다른 노드의 메모리에 액세스하는 노드)이 21 인 것을 볼 수 있습니다.이 시스템은 4 개의 개별으로 구성되지만 블레이드의 경우 대기 시간은 동일한 블레이드 또는 다른 블레이드의 다른 소켓에서 동일합니다.

NUMA에 관한 흥미로운 문서는 RedHat 포털 에도 있습니다 .


답변

아니요. NUMA 노드의 수가 항상 소켓의 수와 같지는 않습니다. 예를 들어, AMD Threadripper 1950X에는 1 개의 소켓과 2 개의 NUMA 노드가 있으며 듀얼 Intel Xeon E5310 시스템은 2 개의 소켓과 1 개의 NUMA 노드를 표시 할 수 있습니다.