Czy liczba węzłów NUMA jest zawsze równa gniazdom?

16

Użyłem lscpudo sprawdzenia konfiguracji dwóch serwerów:

[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

Inny:

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

Zastanawiam się więc, czy liczba węzłów NUMA w rzeczywistości zawsze jest równa gniazdom. Czy jest jakiś przykład, w którym nie są sobie równi?

Nan Xiao
źródło

Odpowiedzi:

20

Dlaczego zastanawiasz się nad liczbą węzłów NUMA? Ważną częścią jest topologia NUMA, która mówi, w jaki sposób są połączone te „węzły”.

Sprawdziłem kilka systemów, w tym 8-gniazdowy (10-rdzeniowy procesor), składający się z 4 połączonych 2-gniazdowych ostrzy (Hitachi Compute Node 2000). Również tutaj liczba węzłów NUMA jest równa liczbie gniazd procesora (8). Zależy to od architektury procesora, głównie od konstrukcji magistrali pamięci.

Cały NUMA (nierównomierny dostęp do pamięci) określa, w jaki sposób każdy logiczny procesor może uzyskać dostęp do każdej części pamięci. Gdy masz system z 2 gniazdami, każdy procesor (gniazdo) ma własną pamięć, do której ma bezpośredni dostęp. Ale musi także mieć dostęp do pamięci w drugim gnieździe - i to oczywiście wymaga więcej cykli procesora niż dostęp do pamięci lokalnej. Węzły NUMA określają, która część pamięci systemowej jest lokalna dla którego procesora. Możesz mieć więcej warstw topologii, na przykład w przypadku systemu HP Superdome (który wykorzystuje procesory Intel Itanium2), masz pamięć lokalnego gniazda procesora, następnie pamięć na innym gnieździe w tej samej komórce, a następnie pamięć w innych komórkach (które mają najwyższe opóźnienie).

Możesz skonfigurować NUMA w swoim systemie, aby zachowywał się tak, aby zapewnić najlepszą możliwą wydajność dla twojego obciążenia. Możesz na przykład zezwolić wszystkim procesorom na dostęp do całej pamięci lub na dostęp tylko do pamięci lokalnej, co następnie zmienia sposób, w jaki program planujący Linux rozdzieli procesy między dostępne procesory logiczne. Jeśli masz wiele procesów wymagających niewielkiej ilości pamięci, skorzystanie tylko z pamięci lokalnej może być korzystne, ale jeśli masz duże procesy (baza danych Oracle z pamięcią współużytkowaną), użycie całej pamięci pomiędzy wszystkimi procesorami może być lepsze.

Możesz użyć poleceń takich jak numastatlub, numactl --hardwareaby sprawdzić status NUMA w systemie. Oto informacje z tej 8-gniazdowej maszyny:

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

Tam możesz zobaczyć ilość pamięci obecną w każdym węźle NUMA (gniazdo procesora) oraz ile z niej jest zużyte i wolne.

Ostatnia sekcja pokazuje topologię NUMA - pokazuje „odległości” między poszczególnymi węzłami pod względem opóźnień w dostępie do pamięci (liczby są tylko względne, nie przedstawiają czasu w ms ani nic takiego). Tutaj widać opóźnienie pamięci lokalnej (węzeł 0 uzyskujący dostęp do pamięci w 0, węzeł 1 w 1, ...) wynosi 10, a opóźnienie zdalne (węzeł uzyskujący dostęp do pamięci w innym węźle) wynosi 21. Chociaż ten system składa się z 4 pojedynczych ostrza, opóźnienie jest takie samo dla różnych gniazd tego samego lub innego ostrza.

Ciekawy dokument na temat NUMA znajduje się również na portalu RedHat .

Marki555
źródło
3

Nie. Liczba węzłów NUMA nie zawsze jest równa liczbie gniazd. Na przykład AMD Threadripper 1950X ma 1 gniazdo i 2 węzły NUMA, podczas gdy podwójny system Intel Xeon E5310 może wyświetlać 2 gniazda i 1 węzeł NUMA.

użytkownik3135484
źródło