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
| Plataforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install numactl |
| Fedora/RHEL | sudo dnf install numactl |
| Arch Linux | sudo pacman -S numactl |
| Verify | numactl --version |
Inspecionando Topologia
| Comando | Mostra |
|---|
numactl --hardware (-H) | Nós NUMA, CPUs por nó, memória por nó, distâncias |
numactl --show (-s) | Política NUMA do processo atual |
numastat | Estatísticas de alocação de memória por nó hit/miss |
lscpu | Mapeamento 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
| Comando | Efeito |
|---|
numactl --cpunodebind=0 --membind=0 ./app | Execute nas CPUs e memória do nó 0 |
numactl -N 1 -m 1 ./app | Forma curta: nó 1 CPUs + memória |
numactl --physcpubind=0-7 ./app | Ligue a núcleos de CPU específicos |
numactl --membind=0,1 ./app | Permitir memória dos nós 0 e 1 |
numactl --interleave=all ./app | Espalhe a memória entre todos os nós (round-robin) |
Políticas de Memória
| Política | Flag | Significado |
|---|
| Bind | --membind=NODES | Aloque apenas desses nós (falha se cheio) |
| Preferred | --preferred=NODE | Prefira um nó, volte se necessário |
| Interleave | --interleave=NODES | Round-robin entre nós (largura de banda) |
| Local | --localalloc | Aloque no nó em que o thread executa |
Quando Usar Qual
| Objetivo | Polí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
| Ferramenta | Função |
|---|
| numactl | Defina política NUMA CPU/memória por processo |
numastat | Monitore eficiência de alocação por nó |
taskset | Afinidade de CPU (sem política de memória NUMA) |
cpupower | Ajuste de frequência/governador de CPU |
kernel numa_balancing | Balanceamento 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