Bewährte Praktiken für die Optimierung von Linux Memory Swappiness und Cache-Verhalten

Schöpfen Sie die Spitzenleistung Ihres Linux-Systems aus, indem Sie das Speichermanagement meistern. Dieser Leitfaden beschreibt bewährte Praktiken für die Anpassung der kritischen Kernel-Parameter `vm.swappiness` und `vfs_cache_pressure`. Erfahren Sie, wie Sie Anwendungs-Latenzzeiten minimieren, die durch unnötiges Swapping auf die Festplatte verursacht werden, und optimieren Sie das Caching von Dateisystem-Metadaten für schnellere E/A-Operationen auf Ihren Servern.

27 Aufrufe

Best Practices für die Optimierung des Linux Memory Swappiness und des Cache-Verhaltens

Linux-Systeme verwalten den Speicher dynamisch und nutzen den verfügbaren RAM für Anwendungen, Dateisystem-Caches und Kernel-Operationen. Obwohl diese Flexibilität eine Stärke ist, können falsch konfigurierte Speicherparameter zu Leistungseinbußen führen, insbesondere durch übermäßigen Platten-I/O aufgrund unnötigen Swappings oder ineffizienter Caching-Strategien.

Dieser Leitfaden beleuchtet zwei kritische Kernel-Parameter, die regeln, wie Linux mit Speicherdruck umgeht: vm.swappiness und vfs_cache_pressure. Das Verständnis und die Feinabstimmung dieser Einstellungen sind für Systemadministratoren unerlässlich, die die Reaktionsfähigkeit von Anwendungen maximieren, die durch Festplattenzugriff verursachte Latenz minimieren und eine stabile Serverleistung gewährleisten möchten.


Verständnis der Linux-Speicherverwaltungsparameter

Linux verwendet Heuristiken, um zu entscheiden, welche Speicherseiten freigegeben werden sollen, wenn das System mehr freien RAM benötigt. Die beiden Hauptbereiche, die durch Kernel-Parameter gesteuert werden, sind Swapping (Verschieben inaktiver Speicherseiten auf die Festplatte) und Caching (Halten von Dateisystem-Metadaten und Daten im RAM).

1. vm.swappiness

vm.swappiness bestimmt die Neigung des Kernels, Prozesse aus dem physischen Speicher auf den Swap-Bereich auf der Festplatte zu verschieben. Es ist ein Wert zwischen 0 und 100.

  • Hoher Wert (z. B. 60, der Standard bei vielen Distributionen): Der Kernel tauscht aggressive inaktive Seiten aus, selbst wenn reichlich freier Speicher verfügbar ist. Dies priorisiert die Beibehaltung eines großen Page-Caches, kann aber bei plötzlichem Speicherbedarf der Anwendungen zu häufigen, latenzverursachenden Swaps führen.
  • Niedriger Wert (z. B. 10 oder weniger): Der Kernel zieht es vor, Speicher aus dem Page-Cache freizugeben, bevor er beginnt, Prozesse auszulagern. Dies hält laufende Anwendungen länger im RAM, was die Reaktionsfähigkeit verbessert, aber potenziell die Festplatten-I/O-Leistung verringert, wenn das System ständig Cache-Seiten verwerfen muss.
  • Wert von 0: Bei modernen Kerneln (nach 2.6.32) versucht die Einstellung von swappiness auf 0, das Swapping vollständig zu vermeiden, bis es absolut notwendig ist (d. h. bei Speichermangel), wodurch sich das System zuerst auf die Freigabe von Speicher aus dem Page-Cache stützt.

Praktische Anwendung von vm.swappiness

Die optimale Einstellung hängt stark von der Workload ab:

Workload-Typ Empfohlener swappiness-Bereich Begründung
Datenbankserver, High-Performance Computing (HPC) 1 - 10 Hält aktive Datenbank-Arbeitssätze im physischen Speicher, um Festplattenlatenz zu vermeiden.
Allzweckserver, Desktops 30 - 60 (Standard) Gleicht die Reaktionsfähigkeit mit dem Bedarf an Festplatten-Caching aus.
Server, die stark auf große Dateicaches angewiesen sind (z. B. Webserver mit hohem Festplattenverkehr) 60 - 80 Priorisiert die Beibehaltung eines großen Festplatten-Caches, um nachfolgende Anfragen schnell aus dem RAM zu bedienen.

So überprüfen Sie den aktuellen Wert:

cat /proc/sys/vm/swappiness

So ändern Sie den Wert vorübergehend (bis zum Neustart):

Um Swappiness auf 10 einzustellen:

sudo sysctl vm.swappiness=10

So ändern Sie den Wert dauerhaft:

Bearbeiten Sie die Datei /etc/sysctl.conf und fügen Sie die Zeile hinzu oder ändern Sie sie:

# /etc/sysctl.conf
vm.swappiness = 10

Nach dem Speichern die Änderungen ohne Neustart anwenden mit:

sudo sysctl -p

Best Practice Tipp: Für moderne Server, die speicherintensive Anwendungen wie Datenbanken hosten, ist die Einstellung von vm.swappiness zwischen 1 und 10 normalerweise der beste Ausgangspunkt, um Leistungseinbußen durch Swapping zu verhindern.

2. vfs_cache_pressure

vfs_cache_pressure steuert, wie aggressiv der Kernel den für Verzeichnis- und Inode-Metadaten verwendeten Speicher (den VFS-Cache) freigibt.

  • Dieser Wert liegt zwischen 0 und 1000.
  • Der Standardwert ist typischerweise 100.

Bei einem Wert von 100 gleicht der Kernel das Freigeben von VFS-Cache-Speicher gegen das Freigeben von Speicher ab, der vom Page-Cache (Festplatten-Daten) verwendet wird. Ein Wert von 100 bedeutet, dass der Kernel bei Speicherdruck versucht, 1 Teil der Inode/Dentry-Cache-Speicher für je 1 Teil des Page-Cache-Speichers freizugeben.

Anpassung von vfs_cache_pressure

  • Erhöhen des Werts (z. B. > 100): Macht den Kernel aggressiver bei der Freigabe von VFS-Cache-Speicher. Dies gibt RAM schneller frei, kann aber zu langsameren nachfolgenden Dateisystem-Suchen führen, da die Metadaten erneut von der Festplatte gelesen werden müssen.
  • Verringern des Werts (z. B. < 100): Macht den Kernel konservativer bei der Freigabe des VFS-Cache. Dies hält Verzeichnis- und Inode-Informationen länger im Speicher, was wiederholte Dateisystemoperationen beschleunigt.

Wann vfs_cache_pressure verringert werden sollte:

Wenn Ihr System häufig auf dieselben großen Verzeichnisstrukturen zugreift (häufig bei komplexen Anwendungen, Container-Orchestrierung oder bestimmten Netzwerkkonfigurationen), kann die Einstellung dieses Wertes auf einen niedrigeren Wert (z. B. 50) die Leistung verbessern, indem Metadaten leichter im RAM verfügbar gehalten werden.

Wann vfs_cache_pressure erhöht werden sollte:

Wenn Ihr System unter allgemeinem Speicherdruck leidet und Sie möchten, dass der Kernel jeden ungenutzten Speicher schnell freigibt, können Sie diesen Wert erhöhen, obwohl dies seltener vorkommt als eine Senkung.

So überprüfen Sie den aktuellen Wert:

cat /proc/sys/vm/vfs_cache_pressure

So ändern Sie den Wert dauerhaft:

Bearbeiten Sie /etc/sysctl.conf:

# /etc/sysctl.conf
vfs_cache_pressure = 50

Änderungen mit sudo sysctl -p anwenden.

Warnung: Die Einstellung von vfs_cache_pressure auf 0 deaktiviert effektiv die Freigabe von VFS-Cache-Speicher durch den Kernel, ähnlich wie die Einstellung von vm.swappiness=0 für das Swapping. Dies sollte nur auf Systemen mit reichlich RAM erfolgen, die maximale Dateisystemleistung benötigen.


Umfassende Tuning-Szenarien

Die Auswahl der richtigen Kombination dieser Parameter optimiert den Kompromiss zwischen Anwendungssstabilität und Dateisystem-Caching.

Szenario 1: Datenbankserver (Speicherpriorität)

Ziel: Maximale Speicheresidenz der Anwendung; Swapping unter allen Umständen minimieren.

  • vm.swappiness = 5
  • vfs_cache_pressure = 50 (Dateidaten zwar etwas im Cache halten, aber Anwendungsspeicher Vorrang vor VFS-Metadaten geben, wenn der RAM knapp wird).

Szenario 2: Server mit hohem Festplatten-I/O (Caching-Priorität)

Ziel: Maximale Festplattenleistung, indem häufig aufgerufene Datei-Daten im Page-Cache gehalten werden.

  • vm.swappiness = 80 (Ermöglicht ein früheres Swapping, um RAM für die Erweiterung des Festplatten-Caches freizugeben).
  • vfs_cache_pressure = 100 (Standard-Balance zwischen Inode- und Page-Cache).

Szenario 3: Virtualisierungshost oder Allzwecksystem

Ziel: Stabile Leistung über mehrere Workloads hinweg.

  • vm.swappiness = 30 (Eine moderate Einstellung, die bevorzugt, aktive VMs/Prozesse etwas länger als der Standardwert 60 im RAM zu halten, aber kontrolliertes Swapping noch erlaubt).
  • vfs_cache_pressure = 100 (Standard ist oft ausreichend).

Überwachung und Validierung

Nach dem Anwenden der Änderungen ist eine kontinuierliche Überwachung unerlässlich, um die Auswirkungen zu validieren. Verwenden Sie Tools wie free, vmstat und System-Leistungsüberwachungs-Dashboards.

Verwendung von vmstat:

Überwachen Sie die Spalten si (swap in) und so (swap out). Ein gesundes System mit niedrigem swappiness sollte unter normaler Last niedrige oder Nullwerte für si und so aufweisen.

vmstat 5 10

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----\ r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 123456 102400 5123456    0    0     0     5   40   70  1  1 98  0  0

Wenn die so-Werte nach der Reduzierung von swappiness weiterhin hoch sind, deutet dies darauf hin, dass der physische RAM für die Workload tatsächlich unzureichend ist und die Erhöhung des RAMs die einzig dauerhafte Lösung ist.

Schlussfolgerung

Tuning von vm.swappiness und vfs_cache_pressure sind grundlegende Techniken bei der Linux-Leistungsoptimierung. Durch die konservative Reduzierung von swappiness (z. B. auf 10) für speicherintensive Anwendungen stellen Sie sicher, dass wichtige Prozesse im physischen RAM verbleiben. Gleichzeitig ermöglicht die Feinabstimmung von vfs_cache_pressure Administratoren, die Präferenz des Kernels zwischen der Speicherung von Dateisystem-Metadaten und Anwendungsdaten im Speicher festzulegen. Testen Sie Änderungen immer unter realistischen Lastbedingungen, um den gewünschten Leistungssprung zu bestätigen.