Salta ai contenuti

numactl - Cheatsheet Binding CPU e Memoria NUMA

numactl - Cheatsheet Binding CPU e Memoria NUMA

numactl controlla la politica NUMA (Non-Uniform Memory Access) per i processi. Su server multi-socket, la memoria collegata a un socket CPU (nodo) è più veloce per quel socket ad accedere rispetto alla memoria su un altro nodo; un processo che rimbalza tra nodi paga una penalità di latenza. numactl ti permette di legare un processo a nodi NUMA specifici — fissando i suoi CPU e la sua memoria allo stesso nodo — che può migliorare significativamente le prestazioni per i carichi di lavoro legati alla memoria come database e lavori HPC.

Installazione

PiattaformaComando
Debian/Ubuntusudo apt install numactl
Fedora/RHELsudo dnf install numactl
Arch Linuxsudo pacman -S numactl
Verificanumactl --version

Ispezionare la Topologia

ComandoMostra
numactl --hardware (-H)Nodi NUMA, CPU per nodo, memoria per nodo, distanze
numactl --show (-s)Politica NUMA del processo corrente
numastatStatistiche di hit/miss di allocazione per nodo
lscpuMappatura CPU-to-node (CPU del nodo NUMA)
# Vedi quanti nodi NUMA e quali CPU/memoria appartengono a ogni nodo
numactl --hardware

Legare un Processo

ComandoEffetto
numactl --cpunodebind=0 --membind=0 ./appEsegui su CPU e memoria del nodo 0
numactl -N 1 -m 1 ./appForma breve: CPU del nodo 1 + memoria
numactl --physcpubind=0-7 ./appLega a core CPU specifici
numactl --membind=0,1 ./appConsenti memoria dai nodi 0 e 1
numactl --interleave=all ./appDistribuisci memoria attraverso tutti i nodi (round-robin)

Politiche di Memoria

PoliticaFlagSignificato
Bind--membind=NODESAlloca solo da questi nodi (fallisci se pieno)
Preferred--preferred=NODEPreferisci un nodo, ritorna se necessario
Interleave--interleave=NODESRound-robin attraverso i nodi (larghezza di banda)
Local--localallocAlloca sul nodo su cui il thread viene eseguito

Quando Usare Quale

ObiettivoPolitica
Sensibile alla latenza, entra in un nodo--cpunodebind=N --membind=N (co-locate)
Legato alla larghezza di banda, grande footprint--interleave=all
Principalmente un nodo, spillover occasionale--preferred=N
Lascia che il kernel decida localmente--localalloc

Flussi di Lavoro Comuni

# Fissa un database al nodo 0 per evitare la latenza della memoria cross-node
numactl --cpunodebind=0 --membind=0 postgres -D /data

# Analytics con uso intensivo di larghezza di banda: interleave memoria attraverso tutti i nodi
numactl --interleave=all ./analytics-job

# Riserva core specifici per un processo real-time
numactl --physcpubind=8-15 --membind=1 ./rt-app

# Controlla quale politica usa una configurazione in esecuzione
numactl --show

Strumenti di Accordatura Correlati

StrumentoRuolo
numactlImposta la politica CPU/memoria NUMA per processo
numastatMonitora l”efficienza dell”allocazione per nodo
tasksetAffinità CPU (senza politica di memoria NUMA)
cpupowerAccordatura della frequenza/governor della CPU
kernel numa_balancingBilanciamento NUMA automatico (/proc/sys/kernel)

Accoppia numactl con cpupower per il controllo della frequenza; usa numastat per confermare che il binding ha effettivamente ridotto i miss cross-node.

Verifica della Vittoria

# Prima/dopo: guarda numa_miss / numa_foreign cadere dopo il binding
numastat -p $(pgrep -n app)

Alto numa_miss / numa_foreign significa che la memoria viene servita da un nodo remoto — esattamente ciò che il binding corregge.

Risorse