Memory Overcommitment: Ballooning & KSM (Artikel 407)
Maximierung der Speicherdichte in virtuellen Umgebungen. Erfahren Sie alles über Kernel Samepage Merging (KSM) und dynamisches Memory Ballooning zur effizienten RAM-Nutzung.
# RAM Optimization: Mehr VMs durch Ballooning und KSM
TL;DR / Management Summary Arbeitsspeicher ist oft der limitierende Faktor bei der Server-Virtualisierung. Mit Memory Overcommitment können wir mehr RAM an VMs vergeben, als physisch vorhanden ist. Wir nutzen dafür zwei geniale Kernel-Techniken: VirtIO Ballooning, das ungenutzten RAM aus den Gästen “absaugt”, und KSM (Kernel Samepage Merging), das identische Speicherseiten (z.B. der gleiche Linux-Kernel in 100 VMs) im RAM dedupliziert. Ein Senior Admin nutzt diese Hebel, um die Hardware-Effizienz zu verdoppeln, ohne die Stabilität zu gefährden.
# 1. Einführung & Architektur
Die Werkzeuge der Verdichtung.
- Memory Ballooning: Ein Treiber im Gast (Balloon-Driver), der sich aufbläst und RAM vom Gast-Betriebssystem anfordert, um diesen an den Host zurückzugeben.
- KSM: Ein Hintergrund-Thread des Kernels, der den RAM nach Duplikaten scannt und diese zu einer einzigen Seite verschmilzt.
# Die Architektur-Logik (Mermaid)
graph TD
subgraph "SLES / Proxmox Host"
A[Physical RAM: 64GB]
B[KSM: Deduplication Engine]
C[QEMU Process: VM 1]
D[QEMU Process: VM 2]
end
subgraph "Guest VM 1"
E[Guest OS]
F[Balloon Driver: Inflated]
end
subgraph "Guest VM 2"
G[Guest OS]
H[Balloon Driver: Deflated]
end
F -->|Return RAM| A
C --- B
D --- B
B -->|Savings| A
# 2. Memory Ballooning in der Praxis
Dynamische Zuweisung.
# Voraussetzungen
Der Gast braucht den virtio_balloon Treiber.
lsmod | grep virtio_balloon
# Steuerung vom Host (via virsh)
# Setze aktuelles RAM-Limit der VM auf 2GB (während sie läuft)
virsh setmem <vmid> 2G --live
Der Balloon-Treiber im Gast sorgt dafür, dass das OS den Speicher freigibt, indem er ihn selbst belegt und dem Hypervisor meldet.
# 3. Kernel Samepage Merging (KSM)
Deduplizierung im Arbeitsspeicher.
KSM ist ideal, wenn viele identische VMs laufen.
# Aktivierung am Host
echo 1 | sudo tee /sys/kernel/mm/ksm/run
# Erfolg messen
cat /sys/kernel/mm/ksm/pages_sharing
# Zeigt an, wie viele Seiten aktuell geteilt werden.
# Rechnen: Wert * 4096 / 1024 / 1024 = Gesparte MB.
# 4. Day-2 Operations: Performance vs. Dichte
Den Preis der Effizienz kennen.
- KSM-Overhead: Der Scanner-Thread (
ksmd) verbraucht CPU-Zyklen. Wenn der Server bereits bei 90% CPU-Last ist, deaktivieren Sie KSM. - Ballooning-Latenz: Wenn eine VM plötzlich viel RAM braucht (Deflate), kann dies kurzzeitige Latenzen verursachen, bis der Host den Speicher physisch bereitstellt.
# 5. Troubleshooting & “War Stories”
Wenn der Host ‘lügt’.
# Story 1: “Der hängende SQL-Server durch Ballooning”
Symptom: Eine Datenbank in einer VM wird extrem langsam, obwohl top in der VM 50% freien RAM anzeigt.
Ursache: Der Balloon-Treiber hat sich “aufgeblasen” und dem Gast-Betriebssystem suggeriert, dass nur noch wenig RAM da ist. Das Gast-OS hat daraufhin wichtige Datenbank-Caches gelöscht.
Lösung: Nutzen Sie kein Ballooning für Datenbanken oder Applikationen mit großen In-Memory Caches. Setzen Sie dort festen RAM (Min = Max).
# Story 2: “Das KSM-Sicherheitsrisiko”
Symptom: Ein Security-Auditor bemängelt die Aktivierung von KSM. Ursache: Side-Channel Attacks (wie Rowhammer oder Cache-Timing). Durch das Teilen von Speicherseiten könnten theoretisch Informationen zwischen VMs fließen. Lösung: In hochsicheren Multi-Tenant Umgebungen (Public Cloud) wird KSM meist deaktiviert. In privaten Enterprise-RZ überwiegt oft der Nutzen der Kosteneinsparung.
# 6. Fazit & Empfehlung
- Standard: Aktivieren Sie Ballooning für Desktop-VMs und einfache Webserver.
- Performance: Deaktivieren Sie Ballooning für SAP, Oracle und SQL-Server.
- Wartung: Überwachen Sie den
ksm-Status. Wenn die Ersparnis < 5% ist, schalten Sie den Dienst ab, um CPU zu sparen.
# Anhang: Cheatsheet
| Aufgabe | Pfad / Befehl |
|---|---|
| KSM Status | cat /sys/kernel/mm/ksm/run |
| KSM Einsparung | cat /sys/kernel/mm/ksm/pages_sharing |
| Scan-Rate ändern | echo 100 > /sys/kernel/mm/ksm/sleep_millisecs |
| Balloon Status | virsh dommemstat <name> |
| Max RAM setzen | virsh setmaxmem <name> 8G |
| Aktueller RAM | virsh setmem <name> 4G |
| Kernel Config | CONFIG_KSM=y |
| Memory Stats | `cat /proc/meminfo |