numactl - Enlace de CPU y memoria NUMA
numactl controla la política de NUMA (Acceso a memoria no uniforme) para procesos. En servidores multi-socket, la memoria conectada a un socket de CPU (nodo) es más rápida para que ese socket acceda que la memoria en otro nodo; un proceso rebotando entre nodos paga una penalidad de latencia. numactl te permite enlazar un proceso a nodos NUMA específicos — fijando sus CPUs y su memoria al mismo nodo — lo que puede mejorar significativamente el rendimiento para cargas de trabajo vinculadas a memoria como bases de datos y trabajos de HPC.
Instalación
| Plataforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install numactl |
| Fedora/RHEL | sudo dnf install numactl |
| Arch Linux | sudo pacman -S numactl |
| Verificar | numactl --version |
Inspeccionando la topología
| Comando | Muestra |
|---|
numactl --hardware (-H) | Nodos NUMA, CPUs por nodo, memoria por nodo, distancias |
numactl --show (-s) | Política NUMA del proceso actual |
numastat | Estadísticas de hit/miss de asignación por nodo |
lscpu | Mapeo de CPU a nodo (CPUs de nodo NUMA) |
# Ve cuántos nodos NUMA y qué CPUs/memoria pertenecen a cada uno
numactl --hardware
Enlazando un proceso
| Comando | Efecto |
|---|
numactl --cpunodebind=0 --membind=0 ./app | Ejecuta en CPUs y memoria del nodo 0 |
numactl -N 1 -m 1 ./app | Forma corta: CPUs + memoria del nodo 1 |
numactl --physcpubind=0-7 ./app | Enlaza a núcleos de CPU específicos |
numactl --membind=0,1 ./app | Permite memoria de nodos 0 y 1 |
numactl --interleave=all ./app | Dispersa memoria entre todos los nodos (round-robin) |
Políticas de memoria
| Política | Bandera | Significado |
|---|
| Enlace | --membind=NODES | Solo asignar de estos nodos (falla si está lleno) |
| Preferido | --preferred=NODE | Prefiere un nodo, retrocede si es necesario |
| Intercalar | --interleave=NODES | Round-robin entre nodos (ancho de banda) |
| Local | --localalloc | Asigna en el nodo donde se ejecuta el thread |
Cuándo usar cuál
| Objetivo | Política |
|---|
| Sensible a latencia, cabe en un nodo | --cpunodebind=N --membind=N (co-locate) |
| Vinculado a ancho de banda, huella grande | --interleave=all |
| Principalmente un nodo, derrame ocasional | --preferred=N |
| Dejar que el kernel decida localmente | --localalloc |
Flujos de trabajo comunes
# Fija una base de datos al nodo 0 para evitar latencia de memoria entre nodos
numactl --cpunodebind=0 --membind=0 postgres -D /data
# Trabajo de análisis intensivo en ancho de banda: intercala memoria entre todos los nodos
numactl --interleave=all ./analytics-job
# Reserva núcleos específicos para un proceso de tiempo real
numactl --physcpubind=8-15 --membind=1 ./rt-app
# Comprueba qué política usa una configuración en ejecución
numactl --show
Herramientas de sintonización relacionadas
| Herramienta | Rol |
|---|
| numactl | Establece política de CPU/memoria NUMA por proceso |
numastat | Monitorea eficiencia de asignación por nodo |
taskset | Afinidad de CPU (sin política de memoria NUMA) |
cpupower | Sintonización de frecuencia/gobernador de CPU |
numa_balancing del kernel | Equilibrio automático de NUMA (/proc/sys/kernel) |
Empareja numactl con cpupower para control de frecuencia; usa numastat para confirmar que tu enlace realmente redujo fallos entre nodos.
Verificando la ganancia
# Antes/después: ve cómo numa_miss / numa_foreign caen después de enlazar
numastat -p $(pgrep -n app)
numa_miss / numa_foreign alto significa que la memoria se sirve desde un nodo remoto — exactamente lo que arregla el enlace.
Recursos