Zum Inhalt springen

numactl - NUMA CPU & Memory Binding Cheatsheet

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

PlatformCommand
Debian/Ubuntusudo apt install numactl
Fedora/RHELsudo dnf install numactl
Arch Linuxsudo pacman -S numactl
Verifynumactl --version

Inspecting Topology

CommandZeigt
numactl --hardware (-H)NUMA-Knoten, CPUs pro Knoten, Speicher pro Knoten, Distanzen
numactl --show (-s)NUMA-Policy des aktuellen Prozesses
numastatPro-Knoten Speicher-Allokation Hit/Miss Stats
lscpuCPU-zu-Knoten Mapping (NUMA-Knoten CPUs)
# See how many NUMA nodes and which CPUs/memory belong to each
numactl --hardware

Binding a Process

CommandEffekt
numactl --cpunodebind=0 --membind=0 ./appFühre auf Knoten 0s CPUs und Speicher aus
numactl -N 1 -m 1 ./appKurzform: Knoten 1 CPUs + Speicher
numactl --physcpubind=0-7 ./appBinde an spezifische CPU-Kerne
numactl --membind=0,1 ./appErlaube Speicher von Knoten 0 und 1
numactl --interleave=all ./appVerteile Speicher über alle Knoten (Round-Robin)

Memory Policies

PolicyFlagBedeutung
Bind--membind=NODESNur von diesen Knoten allokieren (scheitern wenn voll)
Preferred--preferred=NODEBevorzuge einen Knoten, fallback wenn nötig
Interleave--interleave=NODESRound-Robin über Knoten (Bandbreite)
Local--localallocAllokiere auf den Knoten der Thread läuft

When to Use Which

GoalPolicy
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
ToolRolle
numactlSetze NUMA CPU/Memory Policy pro Prozess
numastatÜberwache Pro-Knoten Allokationseffizienz
tasksetCPU Affinity (ohne NUMA Memory Policy)
cpupowerCPU Frequenz/Governor Tuning
kernel numa_balancingAutomatisches 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