Pular para o conteúdo

numactl - Cheatsheet de Ligação de CPU e Memória NUMA

numactl - Cheatsheet de Ligação de CPU e Memória NUMA

numactl controla a política de NUMA (Non-Uniform Memory Access) para processos. Em servidores multi-socket, a memória anexada a um socket de CPU (nó) é mais rápida para esse socket acessar do que a memória em outro nó; um processo saltando entre nós paga uma penalidade de latência. numactl permite que você ligue um processo a nós NUMA específicos — fixando suas CPUs e sua memória no mesmo nó — o que pode melhorar significativamente o desempenho para cargas de trabalho associadas à memória como bancos de dados e trabalhos HPC.

Instalação

PlataformaComando
Debian/Ubuntusudo apt install numactl
Fedora/RHELsudo dnf install numactl
Arch Linuxsudo pacman -S numactl
Verifynumactl --version

Inspecionando Topologia

ComandoMostra
numactl --hardware (-H)Nós NUMA, CPUs por nó, memória por nó, distâncias
numactl --show (-s)Política NUMA do processo atual
numastatEstatísticas de alocação de memória por nó hit/miss
lscpuMapeamento de CPU para nó (CPUs de nó NUMA)
# See how many NUMA nodes and which CPUs/memory belong to each
numactl --hardware

Ligando um Processo

ComandoEfeito
numactl --cpunodebind=0 --membind=0 ./appExecute nas CPUs e memória do nó 0
numactl -N 1 -m 1 ./appForma curta: nó 1 CPUs + memória
numactl --physcpubind=0-7 ./appLigue a núcleos de CPU específicos
numactl --membind=0,1 ./appPermitir memória dos nós 0 e 1
numactl --interleave=all ./appEspalhe a memória entre todos os nós (round-robin)

Políticas de Memória

PolíticaFlagSignificado
Bind--membind=NODESAloque apenas desses nós (falha se cheio)
Preferred--preferred=NODEPrefira um nó, volte se necessário
Interleave--interleave=NODESRound-robin entre nós (largura de banda)
Local--localallocAloque no nó em que o thread executa

Quando Usar Qual

ObjetivoPolítica
Latência-sensível, cabe em um nó--cpunodebind=N --membind=N (co-locate)
Bandwidth-bound, grande footprint--interleave=all
Principalmente um nó, derramamento ocasional--preferred=N
Deixe o kernel decidir localmente--localalloc

Fluxos de Trabalho Comuns

# Pin a database to node 0 to avoid cross-node memory latency
numactl --cpunodebind=0 --membind=0 postgres -D /data

# Bandwidth-heavy analytics: interleave memory across all nodes
numactl --interleave=all ./analytics-job

# Reserve specific cores for a real-time process
numactl --physcpubind=8-15 --membind=1 ./rt-app

# Check what policy a running setup uses
numactl --show

Ferramentas de Ajuste Relacionadas

FerramentaFunção
numactlDefina política NUMA CPU/memória por processo
numastatMonitore eficiência de alocação por nó
tasksetAfinidade de CPU (sem política de memória NUMA)
cpupowerAjuste de frequência/governador de CPU
kernel numa_balancingBalanceamento NUMA automático (/proc/sys/kernel)

Emparelhe numactl com cpupower para controle de frequência; use numastat para confirmar que sua ligação realmente reduziu perdas entre nós.

Verificando a Vitória

# Before/after: watch numa_miss / numa_foreign drop after binding
numastat -p $(pgrep -n app)

Alto numa_miss / numa_foreign significa que a memória está sendo servida a partir de um nó remoto — exatamente o que ligação corrige.

Recursos