linux-kernel-advanced performance tuning numa memory cpu server-hardware advanced

NUMA Mastery: Multi-Socket Performance (Artikel 382)

Tiefgehende Analyse der Non-Uniform Memory Access (NUMA) Architektur. Erfahren Sie alles über lokale vs. entfernte Speicherzugriffe, Memory-Interleaving und die Diagnose von NUMA-Flaschenhälsen.

# NUMA Mastery: Den Speicherpfad in Multi-Socket Systemen optimieren

TL;DR / Management Summary In modernen Servern mit zwei oder mehr CPUs ist der Arbeitsspeicher nicht mehr gleichmäßig angebunden. Jede CPU hat ihren eigenen “lokalen” RAM (NUMA Node). Greift CPU 1 auf den RAM von CPU 0 zu (Remote Access), steigt die Latenz massiv an. Ein Senior Admin nutzt numastat, um solche ineffizienten Zugriffe zu finden, und steuert mit numactl die Speicher-Allokations-Strategie (Local, Preferred oder Interleave), um das Maximum aus der Hardware herauszuholen.


# 1. Einführung & Architektur

Die Geographie des RAMs.

NUMA (Non-Uniform Memory Access) bedeutet: Der Zugriff auf den Speicher dauert unterschiedlich lange, je nachdem, welcher Kern auf welchen Riegel zugreift.

# Die Latenz-Falle (Mermaid)

graph LR
    subgraph "NUMA Node 0"
        A[CPU 0] --- B[Local RAM 0]
    end
    subgraph "NUMA Node 1"
        C[CPU 1] --- D[Local RAM 1]
    end
    A -->|Fast: 50ns| B
    C -->|Fast: 50ns| D
    A -->|Slow: 150ns| D
    C -->|Slow: 150ns| B
    B <-->|QPI / UPI / Infinity Fabric| D

# 2. Diagnose: Habe ich ein NUMA-Problem?

Zahlen lügen nicht.

# Den Aufbau verstehen

numactl -H
# Zeigt die Anzahl der Nodes, CPUs pro Node und die 'Distance' (Latenz-Faktor).

# Statistiken prüfen

numastat

Achten Sie auf numa_miss und numa_foreign. Wenn diese Werte hoch sind und stetig steigen, muss ein Prozess ständig auf den Speicher des anderen Sockels warten.


# 3. Strategien zur Speicher-Allokation

Die passende Politik wählen.

Mit numactl können wir das Verhalten des Kernels beim Reservieren von RAM steuern.

# 1. Membind (Strikte Trennung)

Der Prozess darf nur RAM vom eigenen Node nutzen. Wenn dieser voll ist, wird geswappt (statt Remote-RAM zu nutzen).

numactl --membind=0 ./my_app

# 2. Interleave (Gleichmäßige Verteilung)

Daten werden über alle Nodes verteilt. Ideal für Applikationen, die mehr RAM brauchen, als ein einzelner Sockel bietet (z.B. große Caches/In-Memory DBs).

numactl --interleave=all ./redis-server

# 4. Day-2 Operations: Automatischer Balancer

Der Kernel hilft mit.

Linux hat einen eingebauten Automatic NUMA Balancer. Er versucht, Speicherseiten automatisch zu der CPU zu verschieben, die am häufigsten darauf zugreift.

# Status prüfen und steuern

# 1 = Aktiviert, 0 = Deaktiviert
sysctl kernel.numa_balancing

Enterprise-Tipp: Bei extrem performance-kritischen Workloads (Latenz!) kann der Auto-Balancer kontraproduktiv sein, da das Verschieben der Seiten selbst CPU-Zeit kostet. Testen Sie die Deaktivierung bei manuell gepinnten Applikationen.


# 5. Troubleshooting & “War Stories”

Wenn das System trotz freiem RAM swappt.

# Story 1: “Der plötzliche Swap-Tod”

Symptom: free -m zeigt 64GB freien RAM an, aber das System beginnt massiv zu swappen. Die Performance bricht ein. Ursache: NUMA Imbalance. Ein Prozess ist an Node 0 gebunden. Der RAM von Node 0 ist zu 100% voll, während Node 1 komplett leer ist. Der Kernel beginnt zu swappen, da der Prozess keinen Zugriff auf Node 1 hat. Lösung: Stellen Sie den Prozess auf --preferred statt --membind um oder nutzen Sie --interleave, um den RAM über alle Sockel zu streuen.

# Story 2: “Das langsame Backup”

Symptom: Ein Backup-Server mit 2 CPUs erreicht nur 300MB/s beim Komprimieren, obwohl 10Gbit Netzwerk und schnelle NVMe vorhanden sind. Ursache: Der Backup-Prozess liest Daten von einer NVMe, die an CPU 0 hängt, läuft aber selbst auf CPU 1. Jedes Byte muss über den langsamen Inter-Socket-Bus (UPI/QPI). Lösung: Pinnen Sie den Prozess an den Node, an dem die Hardware (NIC/Storage) hängt. Finden Sie den Node via: cat /sys/class/net/eth0/device/numa_node.


# 6. Fazit & Empfehlung

  • Virtualisierung: Achten Sie bei Proxmox/KVM auf die Einstellung “NUMA: on” in den VM-Optionen, damit der Gast die Hardware-Topologie versteht.
  • Wahl: Nutzen Sie --interleave für Applikationen, die den gesamten RAM des Servers brauchen.
  • Hardware: Achten Sie beim Kauf auf eine symmetrische Bestückung der RAM-Bänke pro CPU.

# Anhang: Cheatsheet

Aufgabe Befehl
Hardware Topologie numactl -H
Stats pro Prozess numastat -p <pid>
Stats global numastat
Speicher binden numactl --membind=<node> <cmd>
CPU binden numactl --cpunodebind=<node> <cmd>
Interleave Modus numactl --interleave=all <cmd>
Auto Balancer sysctl kernel.numa_balancing
Device Node finden cat /sys/class/pci_endpoints/*/numa_node
Latenz-Tabelle `numactl --hardware
Memory Details cat /proc/buddyinfo