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
| Plateforme | Commande |
|---|
| Debian/Ubuntu | sudo apt install numactl |
| Fedora/RHEL | sudo dnf install numactl |
| Arch Linux | sudo pacman -S numactl |
| Vérifier | numactl --version |
Inspection de la topologie
| Commande | Affiche |
|---|
numactl --hardware (-H) | Nœuds NUMA, CPUs par nœud, mémoire par nœud, distances |
numactl --show (-s) | Politique NUMA du processus actuel |
numastat | Statistiques d’allocation mémoire par nœud hit/miss |
lscpu | Mappage 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
| Commande | Effet |
|---|
numactl --cpunodebind=0 --membind=0 ./app | Exécuter sur les CPUs et mémoire du nœud 0 |
numactl -N 1 -m 1 ./app | Forme courte : nœud 1 CPUs + mémoire |
numactl --physcpubind=0-7 ./app | Épingler sur les cœurs CPU spécifiques |
numactl --membind=0,1 ./app | Permettre la mémoire des nœuds 0 et 1 |
numactl --interleave=all ./app | Répartir la mémoire sur tous les nœuds (round-robin) |
Politiques mémoire
| Politique | Drapeau | Sens |
|---|
| Bind | --membind=NODES | Allouer seulement à partir de ces nœuds (échouer si complet) |
| Preferred | --preferred=NODE | Préférer un nœud, retour si nécessaire |
| Interleave | --interleave=NODES | Round-robin sur les nœuds (bande passante) |
| Local | --localalloc | Allouer sur le nœud où le thread s’exécute |
Quand utiliser lequel
| Objectif | Politique |
|---|
| 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
| Outil | Rôle |
|---|
| numactl | Définir la politique CPU/mémoire NUMA par processus |
numastat | Surveiller l’efficacité d’allocation par nœud |
taskset | Affinité CPU (sans politique mémoire NUMA) |
cpupower | Tuning 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