Aller au contenu

numactl - Liaison CPU et mémoire NUMA

numactl - Liaison CPU et mémoire NUMA

numactl contrôle la politique NUMA (Non-Uniform Memory Access) pour les processus. Sur les serveurs multi-socket, la mémoire attachée à un socket CPU (nœud) est plus rapide pour ce socket à accéder que la mémoire d’un autre nœud ; un processus rebondissant entre les nœuds paie une pénalité de latence. numactl vous permet d’épingler un processus à des nœuds NUMA spécifiques — en attachant ses CPUs et sa mémoire au même nœud — ce qui peut améliorer considérablement les performances pour les charges de travail limitées par la mémoire comme les bases de données et les travaux HPC.

Installation

PlateformeCommande
Debian/Ubuntusudo apt install numactl
Fedora/RHELsudo dnf install numactl
Arch Linuxsudo pacman -S numactl
Vérifiernumactl --version

Inspection de la topologie

CommandeAffiche
numactl --hardware (-H)Nœuds NUMA, CPUs par nœud, mémoire par nœud, distances
numactl --show (-s)Politique NUMA du processus actuel
numastatStatistiques d’allocation mémoire par nœud hit/miss
lscpuMappage CPU à nœud (CPUs du nœud NUMA)
# See how many NUMA nodes and which CPUs/memory belong to each
numactl --hardware

Épinglage d’un processus

CommandeEffet
numactl --cpunodebind=0 --membind=0 ./appExécuter sur les CPUs et mémoire du nœud 0
numactl -N 1 -m 1 ./appForme courte : nœud 1 CPUs + mémoire
numactl --physcpubind=0-7 ./appÉpingler sur les cœurs CPU spécifiques
numactl --membind=0,1 ./appPermettre la mémoire des nœuds 0 et 1
numactl --interleave=all ./appRépartir la mémoire sur tous les nœuds (round-robin)

Politiques mémoire

PolitiqueDrapeauSens
Bind--membind=NODESAllouer seulement à partir de ces nœuds (échouer si complet)
Preferred--preferred=NODEPréférer un nœud, retour si nécessaire
Interleave--interleave=NODESRound-robin sur les nœuds (bande passante)
Local--localallocAllouer sur le nœud où le thread s’exécute

Quand utiliser lequel

ObjectifPolitique
Sensible à la latence, tient dans un nœud--cpunodebind=N --membind=N (co-locate)
Limité par la bande passante, grande empreinte--interleave=all
Surtout un nœud, débordement occasionnel--preferred=N
Laisser le noyau décider localement--localalloc

Flux de travail courants

# 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

Outils de tuning associés

OutilRôle
numactlDéfinir la politique CPU/mémoire NUMA par processus
numastatSurveiller l’efficacité d’allocation par nœud
tasksetAffinité CPU (sans politique mémoire NUMA)
cpupowerTuning fréquence/gouverneur CPU
noyau numa_balancingÉquilibrage NUMA automatique (/proc/sys/kernel)

Associer numactl avec cpupower pour le contrôle de fréquence ; utilisez numastat pour confirmer que votre liaison a réellement réduit les ratés cross-node.

Vérification du gain

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

Un numa_miss / numa_foreign élevé signifie que la mémoire est servie depuis un nœud distant — exactement ce que la liaison corrige.

Ressources