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
| Piattaforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install numactl |
| Fedora/RHEL | sudo dnf install numactl |
| Arch Linux | sudo pacman -S numactl |
| Verifica | numactl --version |
Ispezionare la Topologia
| Comando | Mostra |
|---|
numactl --hardware (-H) | Nodi NUMA, CPU per nodo, memoria per nodo, distanze |
numactl --show (-s) | Politica NUMA del processo corrente |
numastat | Statistiche di hit/miss di allocazione per nodo |
lscpu | Mappatura CPU-to-node (CPU del nodo NUMA) |
# Vedi quanti nodi NUMA e quali CPU/memoria appartengono a ogni nodo
numactl --hardware
Legare un Processo
| Comando | Effetto |
|---|
numactl --cpunodebind=0 --membind=0 ./app | Esegui su CPU e memoria del nodo 0 |
numactl -N 1 -m 1 ./app | Forma breve: CPU del nodo 1 + memoria |
numactl --physcpubind=0-7 ./app | Lega a core CPU specifici |
numactl --membind=0,1 ./app | Consenti memoria dai nodi 0 e 1 |
numactl --interleave=all ./app | Distribuisci memoria attraverso tutti i nodi (round-robin) |
Politiche di Memoria
| Politica | Flag | Significato |
|---|
| Bind | --membind=NODES | Alloca solo da questi nodi (fallisci se pieno) |
| Preferred | --preferred=NODE | Preferisci un nodo, ritorna se necessario |
| Interleave | --interleave=NODES | Round-robin attraverso i nodi (larghezza di banda) |
| Local | --localalloc | Alloca sul nodo su cui il thread viene eseguito |
Quando Usare Quale
| Obiettivo | Politica |
|---|
| 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
| Strumento | Ruolo |
|---|
| numactl | Imposta la politica CPU/memoria NUMA per processo |
numastat | Monitora l”efficienza dell”allocazione per nodo |
taskset | Affinità CPU (senza politica di memoria NUMA) |
cpupower | Accordatura della frequenza/governor della CPU |
kernel numa_balancing | Bilanciamento 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