numactl - NUMA CPU & Memory Binding Cheatsheet
numactl steuert die NUMA (Non-Uniform Memory Access)-Policy für Prozesse. Auf Multi-Socket-Servern ist der Speicher, der an einen CPU-Socket (Knoten) angebunden ist, schneller für diesen Socket zuzugreifen als Speicher auf einem anderen Knoten; ein Prozess, der zwischen Knoten springt, zahlt eine Latenz-Strafe. numactl lässt dich einen Prozess an spezifische NUMA-Knoten binden — seine CPUs und seinen Speicher am gleichen Knoten pinnen — was die Leistung für Speicher-gebundene Workloads wie Datenbanken und HPC-Jobs erheblich verbessern kann.
Installation
| Platform | Command |
|---|
| Debian/Ubuntu | sudo apt install numactl |
| Fedora/RHEL | sudo dnf install numactl |
| Arch Linux | sudo pacman -S numactl |
| Verify | numactl --version |
Inspecting Topology
| Command | Zeigt |
|---|
numactl --hardware (-H) | NUMA-Knoten, CPUs pro Knoten, Speicher pro Knoten, Distanzen |
numactl --show (-s) | NUMA-Policy des aktuellen Prozesses |
numastat | Pro-Knoten Speicher-Allokation Hit/Miss Stats |
lscpu | CPU-zu-Knoten Mapping (NUMA-Knoten CPUs) |
# See how many NUMA nodes and which CPUs/memory belong to each
numactl --hardware
Binding a Process
| Command | Effekt |
|---|
numactl --cpunodebind=0 --membind=0 ./app | Führe auf Knoten 0s CPUs und Speicher aus |
numactl -N 1 -m 1 ./app | Kurzform: Knoten 1 CPUs + Speicher |
numactl --physcpubind=0-7 ./app | Binde an spezifische CPU-Kerne |
numactl --membind=0,1 ./app | Erlaube Speicher von Knoten 0 und 1 |
numactl --interleave=all ./app | Verteile Speicher über alle Knoten (Round-Robin) |
Memory Policies
| Policy | Flag | Bedeutung |
|---|
| Bind | --membind=NODES | Nur von diesen Knoten allokieren (scheitern wenn voll) |
| Preferred | --preferred=NODE | Bevorzuge einen Knoten, fallback wenn nötig |
| Interleave | --interleave=NODES | Round-Robin über Knoten (Bandbreite) |
| Local | --localalloc | Allokiere auf den Knoten der Thread läuft |
When to Use Which
| Goal | Policy |
|---|
| Latency-Sensibel, passt in einen Knoten | --cpunodebind=N --membind=N (Co-Locate) |
| Bandbreite-Gebunden, großer Speicherplatz | --interleave=all |
| Meisten einen Knoten, gelegentlicher Overflow | --preferred=N |
| Lass den Kernel lokal entscheiden | --localalloc |
Common Workflows
# 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
| Tool | Rolle |
|---|
| numactl | Setze NUMA CPU/Memory Policy pro Prozess |
numastat | Überwache Pro-Knoten Allokationseffizienz |
taskset | CPU Affinity (ohne NUMA Memory Policy) |
cpupower | CPU Frequenz/Governor Tuning |
kernel numa_balancing | Automatisches NUMA Balancing (/proc/sys/kernel) |
Verbinde numactl mit cpupower für Frequenzsteuerung; verwende numastat um zu bestätigen, dass dein Binding tatsächlich Cross-Node Misses reduziert hat.
Verifying the Win
# Before/after: watch numa_miss / numa_foreign drop after binding
numastat -p $(pgrep -n app)
Hohe numa_miss / numa_foreign bedeutet, dass Speicher von einem Remote-Knoten bedient wird — genau das, was Binding behebt.
Resources