A quantidade de nós NUMA é sempre igual à quantidade de soquetes?

A quantidade de nós NUMA é sempre igual à quantidade de soquetes?

Eu costumava lscpuverificar a configuração de dois servidores:

[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

O outro:

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

Então, estou me perguntando se a quantidade de nós NUMA é sempre igual aos soquetes, de fato. Existe algum exemplo em que eles não sejam iguais?

Responder1

Por que você está se perguntando sobre o número de nós NUMA? A parte importante é a topologia NUMA, que diz como esses “nós” estão conectados.

Eu verifiquei alguns sistemas, incluindo um sistema de 8 soquetes (CPUs de 10 núcleos) que consiste em 4 blades de 2 soquetes interconectados (Hitachi Compute Node 2000). Também aqui o número de nós NUMA é igual ao número de soquetes de CPU (8). Isso depende da arquitetura da CPU, principalmente do design do barramento de memória.

Todo o NUMA (acesso não uniforme à memória) define como cada CPU lógica pode acessar cada parte da memória. Quando você possui um sistema de 2 soquetes, cada CPU (soquete) possui sua própria memória, que pode acessar diretamente. Mas também deve ser capaz de acessar a memória no outro soquete - e isso, é claro, leva mais ciclos de CPU do que acessar a memória local. Os nós NUMA especificam qual parte da memória do sistema é local para qual CPU. Você pode ter mais camadas de topologia, por exemplo, no caso do sistema HP Superdome (que usa CPUs Intel Itanium2), você tem memória de soquete de CPU local, depois memória em soquete diferente dentro da mesma célula e depois memória em outras células (que possuem o latência mais alta).

Você pode configurar o NUMA em seu sistema para se comportar de forma a fornecer o melhor desempenho possível para sua carga de trabalho. Você pode, por exemplo, permitir que todas as CPUs acessem toda a memória ou acessem apenas a memória local, o que altera a forma como o agendador do Linux distribuirá os processos entre as CPUs lógicas disponíveis. Se você tiver muitos processos que não exigem muita memória, usar apenas memória local pode ser benéfico, mas se você tiver processos grandes (banco de dados Oracle com memória compartilhada), usar toda a memória entre todas as CPUs pode ser melhor.

Você pode usar comandos como numastatou numactl --hardwarepara verificar o status do NUMA em seu sistema. Aqui estão as informações dessa máquina de 8 soquetes:

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

Lá você pode ver a quantidade de memória presente em cada nó NUMA (soquete da CPU) e quanto dela está usada e livre.

A última seção mostra a topologia NUMA - mostra as "distâncias" entre nós individuais em termos de latências de acesso à memória (os números são apenas relativos, não representam o tempo em ms nem nada). Aqui você pode ver a latência para a memória local (nó 0 acessando a memória em 0, nó 1 em 1, ...) é 10 enquanto a latência remota (nó acessando a memória em outro nó) é 21. Embora este sistema consista em 4 individuais lâminas, a latência é a mesma para soquetes diferentes na mesma lâmina ou em outra lâmina.

Documento interessante sobre NUMA também está emPortal RedHat.

Responder2

Não. O número de nós NUMA nem sempre é igual ao número de soquetes. Por exemplo, um AMD Threadripper 1950X possui 1 soquete e 2 nós NUMA, enquanto um sistema Intel Xeon E5310 duplo pode mostrar 2 soquetes e 1 nó NUMA.

Responder3

Na verdade não. No meu servidor:

➜ 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 node0 e node1 estão localizados no soquete 0 e os dois restantes estão localizados no soquete 1 no meu servidor.

informação relacionada