Como posso alterar a distribuição de núcleos entre nós NUMA?

5

No Ubuntu 14.04 TLS para 36 total de núcleos = (2 x CPUs x 9 núcleos x 2 HyperThreading), lscpu me dê:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                36
On-line CPU(s) list:   0-35
Thread(s) per core:    2
Core(s) per socket:    9
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Stepping:              2
CPU MHz:               1200.000
BogoMIPS:              5858.45
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              25600K
NUMA node0 CPU(s):     0-8,18-26
NUMA node1 CPU(s):     9-17,27-35

Como se sabe, os dados trocam mais rapidamente entre os núcleos da CPU única (via cache-L3) do que entre os núcleos de várias CPUs diferentes (via QPI-link).

0-8 e 9-17 são núcleos físicos da CPU de dois NUMA-nodes, mas 18-26 e 27-35 são HyperThreading CPU-Cores, e é preferível no início pegar todos os núcleos físicos, e então em a segunda rodada para assumir dois núcleos lógicos em cada núcleo físico, ou seja, isso aumentará o desempenho geral?

Ou significa que se eu lançar mais de 8 threads, por exemplo, 12 threads, então 9 threads (0-8) serão executados na 1ª CPU (NUMA node0) e 3 threads (9-12) na 2ª CPU (NUMA node1)? E isso aumentará a latência de troca entre os encadeamentos e reduzirá o desempenho geral?

Como posso alterar a distribuição de núcleos entre nós NUMA para definir como abaixo?

NUMA node0 CPU(s):     0-17
NUMA node1 CPU(s):     18-35
    
por Alex 27.10.2016 / 01:50

1 resposta

1

Você não pode alterar a distribuição de núcleos entre os nós numa.

Os nós numa são restrições físicas relacionadas a você ter 2 soquetes.

Numa - arquitetura de memória não uniforme, tem uma penalidade por acessar a memória do nó local. Você deve ver os núcleos hyperthreaded aparecerem como 'core' no mesmo nó como os núcleos principais.

Ou seja. se você tiver 9 núcleos / numa e ativar hyperthreading (geralmente não é uma vitória para o desempenho na maioria das situações, pois os núcleos com hyperthread roubam recursos dos principais núcleos resultando em mais 'thrashing', a menos que seus processos com hyperthread sejam parte da mesma programa e usando as mesmas partes de cache que os núcleos principais.Geralmente, as pessoas tratam os núcleos como recursos independentes com núcleos de hyper thread também sendo tratados independentemente.

Para cargas de trabalho gerais, em máquinas "carregadas", o hyperthreading resultará em maior contenção de recursos e atrasará o throughput geral. Se sua carga de trabalho é tal que todos os cpu's principais e hypercpu são dedicados ao mesmo programa, e executando tópicos relacionados - então você pode obter um desempenho melhor com hyperthreading.

Dadas as suas perguntas, eu realmente sugiro desativar o hyperthreading, pois não parece que você esteja reservando 1 numa nó para 1 aplicativo, onde todos eles podem compartilhar memória local e recursos.

Ignorando o problema de hyperthread - já que isso é apenas uma complicação adicional com as mesmas regras aplicáveis, você não pode mover cpu entre nós, já que o núcleo da cpu também é físico, fisicamente localizado em um chip (nó) o outro.

Você pode vincular processos e threads a um nó numa ou a outra usando afinidade de processador - talvez seja o que você está querendo?

    
por 25.03.2018 / 01:17