Swap
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Swap-Speicher sind vom Betriebssystem benutzbare Speicherbereiche auf einem Massenspeicher (z.B. rotierende Festplatte oder SSD) zur temporären Auslagerung von Daten des Arbeitsspeichers (RAM). Der gesamte Swap-Speicher kann aus einem oder mehreren Swap-Bereichen bestehen.
Die "swapping" genannte Nutzung solcher Bereiche diente früher zur Realisierung des Multitasking, indem momentan inaktive Prozesse aus dem Arbeitsspeicher in den Swap-Speicher kopiert und der frei werdende Arbeitsspeicher dem aktiven Prozess zur Verfügung gestellt wurde. Diese Art der Nutzung wird bei Linux nie verwendet.
Linux verwendet mit Swap-Speicher ein fachsprachlich richtigerweise als "paging" zu bezeichnendes Verfahren. Dieses wird heutzutage (2024) umgangssprachlich und auch im Jargon unter Fachleuten unrichtig, aber wohl unausrottbar weit verbreitet ebenfalls "swapping" genannt und dieser Artikel schließt sich dieser Unsitte an:
Dieser Artikel behandelt den praktischen Umgang mit dem "paging" im Linux-Kernel, genannt (das neue) "swapping".
Als weitere, jedoch in diesem Artikel nicht behandelte Nutzungsart eines Swap-Bereiches kann man ihn zur Speicherung des RAM während des auch Ruhezustand genannten Tiefschlafes des Systems (Suspend-to-Disk, STD, Hibernation) benutzen. Die beiden Nutzungsarten sind völlig unabhängig voneinander.
Arbeitsweise¶
Das im Kontext von Swap benutzte Verfahren "paging" wird für die Verwaltung des virtuellen Arbeitsspeichers benötigt. Linux stellt wie alle modernen Betriebssysteme den Prozessen den als Hardware verbauten Arbeitsspeicher nicht direkt zur Verfügung, sondern immer als virtuellen Speicher unter Verwendung einer speziell dafür vorgesehenen Einheit MMU (Memory Managment Unit) in der CPU. Jedem Anwendungsprogramm steht daher eine wesentlich größerer Adressbereich zur Verfügung als tatsächlich Arbeitsspeicher vorhanden ist. Nur ein Teil des versprochenen Adressbereiches wird aber mit echtem RAM hinterlegt. Ein Zugriff auf eine nicht mit echtem RAM hinterlegte Adresse löst einen speziellen Interrupt page_fault
aus und die MMU muss nun nachbessern:
Solange noch echter, nicht zugeteilter Arbeitsspeicher vorhanden ist, wird davon etwas an den auslösenden Prozess zugeteilt. Die Zuteilung erfolgt immer in Blöcken (pages) von meistens 4 kiB, auch Speicherseiten genannt.
Wenn es keinen freien echten RAM mehr gibt, muss der Kernel etwas freiräumen. Dafür gibt es mehrere mögliche Maßnahmen:
Es werden Speicherseiten gesucht, die zwar belegt, deren Inhalt aber wahrscheinlich gar nicht benötigt wird und wenn doch, dann problemlos durch Lesen aus einer vorhandenen Datei von einem Massenspeicher rekonstruierbar wäre. Das sind beispielsweise vom Kernel selbst belegte Puffer und Caches. Wenn das Erfolg verspricht, verzichtet der Kernel auf einen Teil des eigenen Arbeitsspeichers und teilt etwas vom freigewordenen RAM dem notleidenden Prozess zu. Dies ist die kostengünstigste Maßnahme.
Außer Puffern und Caches gibt es auch noch Speicherseiten, die Teile einer Datei enthalten, die von einem Programm gelesen wird, aber selber nicht verändert wurden. Dazu gehören auch Speicherseiten mit ausführbarem Programmcode. Diese Speicherseiten sind ebenfalls später kostengünstig durch lesenden Zugriff auf den Massenspeicher rekonstruierbar. Diese Maßnahme ist etwas teurer als die erste, da es mit höherer Wahrscheinlichkeit tatsächlich später zum lesenden Zugriff auf den Massenspeicher kommen wird.
Speicherseiten mit Arbeitsergebnissen von Programmen, z.B. geänderte, aber nicht nicht auf Massenspeicher geschriebene Dateien können nur zu höheren Kosten aus dem Arbeitsspeicher verdrängt werden: Es muss eine Zwischenspeicherung erfolgen, d.h. ein Schreibzugriff auf den Swap-Speicher und später mit Sicherheit ein weiterer lesender Zugriff auf den Massenspeicher.
Wenn alle vorher genannten Maßnahmen nicht möglich sind, schickt der Kernel den OOM-Killer ("out of memory killer") los. Dieser wählt einen Prozess aus, killt ihn und liefert die seinem Opfer entrissenen Speicherseiten bei der MMU als zuteilbar ab. Aus Sicht des Anwenders wählt der OOM-Killer oft genug einen noch unverzichtbar benötigten Prozess aus, was dann in einem unbenutzbarem oder unbrauchbarem oder auch tatsächlich abgestürztem System endet. Selbst wenn das System diese verzweifelte Maßnahme überlebt, tritt immer unvermeidlich Datenverlust ein.
Die vorstehend vereinfacht beschriebene Arbeitsweise ignoriert einige Details, die für diesen Artikel keine Rolle spielen:
Es kann mehr als einen Speicherpool geben. In der Regel existiert aber nur einer.
Jeder Speicherpool wird unterteilt in Zonen, je nach Lage des Speichers im Adressbereich. Für 64-Bit-Systeme (d.h. außer 32-Bit-CPU, exotische Adressmodus, andere Sonderfälle) gibt es diese Zonen:
Adressen unter 16 MiB
Adressen ab 16 MiB bis unter 4 GiB
Adressen ab 4 GiB
In jeder Zone gibt es Pools unterschiedlicher Größe, d.h. ganzzahligen Vielfachen der Blockgröße (meist 4 KiB).
Ein Notstand tritt auf, wenn Arbeitsspeicher mit der angeforderten Größe und Zone nicht mehr verfügbar ist, auch wenn es noch massenweise freien Speicher mit anderer Stückelung gibt.
Man kann als Anwender eines Linux-Systems nicht verhindern, das irgendwann einmal die 4. Maßnahme zur Anwendung kommt. Man kann nur die Wahrscheinlichkeit dafür durch sinnvolle Maßnahmen verringern:
Man baut genügend Arbeitsspeicher ein, damit die Maßnahmen 1 und 2 funktionieren und möglichst Maßnahme 3 gar nicht benötigt wird.
Man stellt trotzdem mindestens einen Swap-Bereich zur Verfügung, damit Kernel und MMU die Maßnahme 3 überhaupt anwenden können.
Den tatsächlichen Gebrauch des Swap-Speichers überwacht man. Wenn er nicht gebraucht werden, ist das kein Grund auf ihn zu verzichten. Wenn sein Gebrauch ansteigt, denkt man über den Einbau zusätzlichen Arbeitsspeichers nach und überdenkt auch sein eigenes Nutzungsverhalten.
Andererseits ist Swap aber auch kein Ersatz für fehlenden Arbeitsspeicher. So etwas ist zwar technisch möglich und in seltenen Spezialfällen mag das auch sinnvoll sein, aber als Regel gilt: Wenn die Swap-Bereiche intensiv genutzt werden, hat man zu wenig Arbeitsspeicher.
Wenn man gar keinen Swap-Bereich definiert, kann der Zuteilungsalgorithmus für RAM im Linux Kernel die Maßnahme 3 nicht anwenden und ändert deshalb auch seine Arbeitsweise für die Maßnahmen 1 und 2. Er agiert vorsichtiger und damit möglicherweise auch langsamer, d.h. die reine Bereitstellung von Swap-Speicher verbessert bereits die Verwaltung des Arbeitsspeichers, auch wenn der Swap-Speicher gar nicht benutzt wird.
Swapgröße¶
Die passende Speichergröße kann nicht im Allgemeinen angegeben werden, weil sie von mehreren individuellen Faktoren abhängt:
Größe des Arbeitsspeichers: Ein größerer Arbeitsspeicher ist ein valides Argument für eine Verkleinerung des SWAP-Speichers.
Nutzungsart des Arbeitsspeichers (workload)
Art des Massenspeichers (rotierende Magnetplatte oder SSD)
Soll Suspend-to-Disk benutzt werden oder nicht? Wenn man Suspend-to-Disk benutzen möchte, gelten zusätzliche Restriktionen:
Man benötigt einen Auslagerungsbereich mit mindestens der Größe des Arbeitsspeichers.
Diesen Speicherbereich darf man nicht stückeln, sondern er muss fortlaufend beschreibbar sein.
Es gelten diese Regeln:
Ein Swap-Speicher von 0 Bytes ist zu klein für jede Größe des Arbeitsspeichers.
Die Größe des Swap-Speichers soll man so wählen, dass ihre dauerhafte Nutzung klein (z.B. unter 10%) bleibt.
Ein zu großer Swap-Speicher schadet aber jedenfalls nicht; er fordert auch nicht das System heraus, ihn zu benutzen. Das gilt jedenfalls uneingeschränkt für Linux Kernel ab 4.0.
Es gibt keine sinnvolle Kopplung der Größe des Swap-Speichers mit der Größe des Arbeitsspeichers, ausgenommen beim Einsatz von Suspend-to-Disk. Verbreitet aufgedrängte Rezepte wie „Swap-Speicher = halber Arbeitsspeicher“ o.ä. sind Relikte aus der Zeit, als noch wirklich "geswappt", d.h. Prozesse ausgelagert wurden und können nicht sinnvoll auf "paging" übertragen werden.
Ein richtig konfigurierter Swap-Speicher, der im praktischen Einsatz nicht benutzt wird, ist eine gute Nachricht.
Ein fehlender Swap-Speicher liefert einen Grund, den Systemverwalter zu entlassen, denn dieser geht ein zwar geringes, aber unnötiges Risiko für die Betriebssicherheit des von ihm verwalteten Systems ein.
Wer Suspend-to-Disk benutzen möchte oder sich die Möglichkeit dafür offen halten möchte, wählt „Größe des ersten Swap-Bereiches = tatsächlich verbauter RAM“. Man benötigt in der Regel keinen Zuschlag, weil das Speicherabbild für Hibernation komprimiert wird.
Wer Suspend-to-Disk nicht benutzen möchte, wählt z.B. „Größe des Swap-Speichers = 2 GiB“ und trifft Vorsorge, dies später bei Bedarf vergrößern zu können.
Swap anlegen¶
Ubuntu legt bei der Installation standardmäßig automatisch einen Swap-Bereich an, d.h. die meisten Benutzer müssen sich überhaupt nicht um dieses Thema kümmern. Man erhält dann eine Auslagerungsdatei im Wurzel-Dateisystem, was natürlich die Mindestgröße der dafür benutzten Partition etwas erhöht.
Einen neuen Swap-Bereich kann man als separate Partition oder als Datei anlegen. Man kann auch mehrere (bei Linux bis zu 32) Swap-Bereiche anlegen und gleichzeitig nutzen.
Swap-Partition erstellen¶
Man legt auf dem Massenspeichen mit einem gängigem Partitionierungsprogramm[3] (beispielsweise Laufwerke, den Befehlen für die Kommandozeile[1] fdisk, gdisk, parted oder deren halb- bzw. vollgrafischen Pendants) eine neue Partition des Typs
8200
(manchmal abgekürzt zu82
) bei Benutzung des Partitionsschemas DOS/MBR,0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
bei Benutzung des GPT-Schemas an. (gdisk erlaubt aber dafür auch die Angabe8200
.)
Nach Speicherung der Partitionstabelle aktualisiert man die Sicht des Betriebssystems auf die Partitionstabelle:
sudo partprobe
Bei KDE-Systemen kann man benutzen:
sudo kpartx
Die neue Partition muss man noch formatieren.
Eine Swap-Partition wird nicht via mount eingebunden, sondern mit dem Befehl swapon
aktiviert. Das kann auch über die Datei /etc/fstab erfolgen.
Swap-Datei erstellen¶
Eine Auslagerungsdatei kann innerhalb eines von Linux beschreibbar eingebundenen Dateisystems eingerichtet werden, dabei ist aber nicht jeder Typ verwendbar:
ext2/3/4 ist verwendbar.
XFS ist verwendbar.
Btrfs ist eingeschränkt verwendbar: Es muss das Attribut
nocow
gesetzt und damit die Eigenschaft "copy-on-write" ausgeschaltet werden, was normalerweise nicht der Fall ist.Jedes Dateisystem mit der Eigenschaft "copy-on-write" ist ungeeignet für eine Linux-Auslagerungsdatei.
Da jede SSD mit "copy-on-write" arbeitet und damit diese Eigenschaft jedem auf ihr errichteten Dateisystem unterlagert, könnten vielleicht auch in solchen Situationen bzgl. einer Auslagerungsdatei unerwünschte Effekte auftreten.
Rotierende magnetische Festplatten mit SMR-Aufzeichnung sind zwar funktional tauglich für Auslagerungsdateien, aber möglicherweise frustrierend wegen ihres Zeitverhaltens.
NTFS ist ungeeignet für eine Linux-Auslagerungsdatei.
Es sind grundsätzlich sowohl System- wie auch Datenpartitionen geeignet, normalerweise wird aber eine Auslagerungsdatei im Wurzel-Dateisystem (/
) angelegt. Neben dem Verbot von "copy-on-write" sind noch diese Eigenschaften sicher zu stellen:
Das Dateisystem mit der Auslagerungsdatei muss auch später beschreibbar eingebunden werden.
Die Datei muss vor ihrer Formatierung als SWAP bereits in der beabsichtigen Größe existieren.
Sie muss aus Sicht des Dateisystems fortlaufend Speichereinheiten (Cluster) des Dateisystems belegen und darf keine Löcher aufweisen.
Wegen dieser Eigenschaften sind Programme wie cp und truncate
nicht geeignet, und fallocate
ist nur bei XFS geeignet. Man kann mit Hilfe des Programms dd eine Auslagerungsdatei erstellen. Der Dateiname ist beliebig, üblich und auch vom Installer verwendet ist /swapfile. Im folgenden Beispiel ist die Datei 8 GiB groß (8 × 1024 Blöcke mit einer Größe von 1 MiB):
Datei anlegen, das kann je nach Größe einige Minuten dauern:
sudo dd if=/dev/zero of=/swapfile bs=1MiB count=$((8*1024)) status=progress
Die Option
status=progress
ist nicht erforderlich, beruhigt aber den Bediener.Die Datei soll root gehören und nur dieser soll sie lesen können:
sudo chown root:root /swapfile ; sudo chmod 0600 /swapfile
Vor ihrer ersten Aktivierung als Swap-Bereich muss man die Datei als SWAP mit mkswap formatieren.
Dynamisch wachsender Swap¶
Anstelle statisch definierter Swap-Bereiche zu benutzen, kann man auch eine dynamische Auslagerungsdateiverwaltung installieren, die nach Bedarf mehrere kleinere Auslagerungsdateien in einem Ordner anlegt.
Das dafür entwickelte Originalprogramm Swapspace 🇬🇧 wird nicht mehr weiterentwickelt. Es gibt aber einen Fork mit dem gleichen Namen in den offiziellen Paketquellen von Ubuntu:
swapspace (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install swapspace
Oder mit apturl installieren, Link: apt://swapspace
Die Grundkonfiguration von Swapspace
braucht nicht weiter angepasst zu werden.
Hinweis:
Ein Ruhezustand (Suspend-to-Disk) ist damit nicht möglich.
Swap im RAM¶
Manchmal besteht der Wunsch, im RAM selbst einen SWAP-Bereich anzulegen. Der Linux Kernel unterstützt dies durch seine Funktionalitäten zswap
und zcache
sowie zram
.
Eine Verwendung dieser Komponenten kann den Zeitbedarf des "pagings" verringern und helfen, einem Verschleiß der SSD (wenn der Swap-Bereich auf einer SSD liegt) vorzubeugen.
Seit Version 3.11 vom September 2013 ist
zswap
Bestandteil des Linux Kernels. Wenn aktiviert, dann wird vor einer Auslagerung in einen Swap-Bereich noch eine Zwischenspeicherung in einem komprimierendem Cache im realen Arbeitsspeicher versucht.Zswap
benötigt zur korrekten Funktion einen herkömmlichen Swap-Bereich außerhalb des RAM.
→ https://docs.kernel.org/admin-guide/mm/zswap.html 🇬🇧Eine alternative Implementierung derselben Arbeitsweise wie von
zswap
istzcache
. Die ursprüngliche Implementierung wurde aus dem Kernel entfernt und eine überarbeitete Fassung im August 2013 aus dem Staging-Bereich des Kernels gelöscht. Die neue Fassung hat es wohl nicht in den Kernel geschafft, jedenfalls ist unbekannt, wie sie mit einem Ubuntu-Kernel benutzbar wäre.Zram
gehört zum Linux Kernel seit Version 3.14 vom März 2014 und ermöglicht die Erstellung einer Ramdisk, d.h. eines regulären Blockgeräts im Arbeitsspeicher. Ein solche Ramdisk kann entweder beliebige Dateien – natürlich nur temporär – speichern oder einen Swap-Bereich realisieren. Die Speicherung kann und wird in der Regel komprimiert erfolgen.Zram
benötigt für seine Funktion als Swap-Bereich keine Unterstützung durch einen herkömmlichen Swap-Speicher außerhalb des RAM.
→ https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html 🇬🇧
→ https://docs.kernel.org/admin-guide/blockdev/zram.html 🇬🇧
Ubuntu Kernel enthalten zswap
als fest eingebaute, aber standardmäßig nicht aktivierte Funktionalität, und zram
ist als nachladbarer Modul verfügbar. → zram
Eine Aktivierung von zwap
kann
einmalig über den Bootparameter
zswap.enabled=1
auf der Kommandozeile des Kernels,bei jedem Systemstart über den Eintrag des Bootparameters in die Datei /etc/default/grub,
oder im laufenden System mit dem Befehl
echo 1 | sudo tee /sys/module/zswap/parameters/enabled
erfolgen.
Dienstprogramme¶
Zur Verwaltung von Swap-Bereichen gibt es die Programme mkswap
, swapon
, swapoff
und swaplabel
aus dem Paket util-linux, welches bei allen Ubuntu-Systemen bereits bei der Errichtung mit installiert wird.
Jeder der vier genannten Befehle hat seine eigene Manpage.
mkswap¶
Dieser Befehl für die Kommandozeile dient zur Formatierung einer bereits bestehenden Partition oder einer bereits bestehenden Datei als Dateisystem des Typs SWAP.
Die Größe der Speicherblöcke wird automatisch mit der vom Kernel verwendeten Größe für die Seiten im Arbeitsspeicher synchronisiert; meistens ergibt dies 4 kiB.
Die Anzahl der Speicherblöcke wird automatisch so gewählt, dass der verfügbare Platz auf der Partition oder in der Datei ausgenutzt wird. Ein Swap-Bereich kleiner als 10 Blöcke wird nicht benutzt. Die größte nutzbare Blocknummer ist 232-1, d.h. die größte mit 32 Bit darstellbare ganze Zahl.
Man kann bei der Formatierung optional UUID und/oder Label vergeben oder das später mit swaplabel
nachholen.
Achtung!
Nach der Formatierung durch mkswap
ist eine Wiederherstellung bereits gespeicherter Daten ist nur schwer oder gar nicht möglich. Man sollte sich also sicher sein, dass man das richtige Ziel angibt.
Die hier beispielhaft verwendete und anzupassende Partition sda99
wird so formatiert:
sudo mkswap /dev/sda99
Das funktioniert genauso auch mit einer Auslagerungsdatei:
sudo mkswap /swapfile
Dabei muss die hier beispielhaft angegebene Datei /swapfile bereits existieren und die oben genannten technischen Restriktionen erfüllen.
swapon¶
Der Befehl swapon
aktiviert einen Swap-Bereich.
Achtung!
Wenn der Swap-Bereich von systemd verwaltet wird, was bei einem Eintrag in der Datei /etc/fstab immer der Fall ist, sollte man swapon
nicht direkt verwenden, sondern die automatisch generierte Unit des Swap-Bereiches.
Testweise kann man einen Swap-Bereich, natürlich mit Rootrechten[2] mit diesen Befehlen aktivieren:
Entweder Swap-Partition:
sudo swapon /dev/sda99
oder bei Swap-Datei:
sudo swapon /swapfile
Der Befehl kennt einige Optionen, die man in seinen Manpages (Kapitel 8 und 2) nachlesen kann:
Die für die Praxis wichtigste Option ist
--discard
zur Steuerung des TRIM bei SSDs.Wenn man mehr als einen Swap-Bereich verwendet, kann man über die Option
--priority
(oder Abk.-p
) die Reihenfolge ihrer Nutzung steuern. Wenn man diese Option nicht benutzt, sinkt die Priorität automatisch in der Reihenfolge der Aktivierung der Bereiche, d.h. der erste aktivierte Bereich wird bevorzugt benutzt. Wenn man für mehrere Bereiche dieselbe Priorität vergibt, dann werden diese Bereiche wechselweise benutzt.
Der Befehl wird auch beim Systemstart intern zur Aktivierung eines Swap-Bereichs aus der Datei fstab verwendet. Man öffnet die Datei /etc/fstab mit Rootrechten[2] und fügt eine Zeile wie folgende Beispiele ein, in denen die Quelle /dev/sda99
bzw. /swapfile
angepasst werden muss:
/dev/sda99 none swap nofail
/swapfile none swap nofail
Alternativ kann man natürlich anstatt über eine temporäre Gerätedatei wie /dev/sda99
das Swap-Dateisystem auch über dessen UUID oder Label identifizieren.
swapoff¶
Der Befehl swapoff
deaktiviert einen Swap-Bereich. Die Ausführungen zu swapon gelten sinngemäß.
swaplabel¶
Man kann dem errichteten Swap-Dateisystem ein Label geben oder ein bestehendes ändern und/oder dessen UUID ändern, beispielsweise:
sudo swaplabel /dev/sda99
Abfrage von UUID und Label (sofern gesetzt)
sudo swaplabel --label 'Aussenlager 3' /dev/sda99
Label setzen, dabei Leerzeichen und andere Sonderzeichen quotieren. Das Label darf maximal 16 Byte lang sein. Beim Setzen eines Labels wie auch beim folgenden Befehl für das Ändern des UUID darf der Swap-Bereich nicht aktiviert sein.
sudo swaplabel --UUID b20f08ae-d5f5-4829-8e66-e03274606a50 /dev/sda99
UUID auf den angegebenen Wert ändern, dabei die Formatvorgaben für UUIDs beachten.
Die Optionen --label
und --uuid
kann man zu -l
bzw. -u
abkürzen und auch gemeinsam benutzen.
Swapnutzung einstellen¶
Im Internet findet sich weit verbreitet die unzutreffende Behauptung, man könne über die Kernel-Variable vm.swappiness
einstellen, ab welchem Belegungsgrad des realen RAM der Kernel Daten aus dem Arbeitsspeicher in den Swap-Speicher verschiebt. Tatsächlich wird eine solche Verdrängung stets erst dann erwogen, wenn kein Arbeitsspeicher (der angeforderten Größe und Lage) mehr zu vergeben ist und die oben im Abschnitt Arbeitsweise genannte Methode 3 angewendet werden muss.
Die Kernel-Variable vm.swappiness
ist eine Feinabstimmung, über die man einstellen kann, welche Art von Speicherseiten bevorzugt ausgelagert werden soll, aber nicht, ob ausgelagert werden soll.
Für die Methode 3 kommen zwei Arten von Speicherseiten in Frage:
Teile von Dateien, die bereits auf Massenspeicher abgelegt wurden, aber im Arbeitsspeicher verändert wurden. Solche Speicherseiten (file_pages) werden beim "paging" nicht in einen Swap-Bereich ausgelagert, sondern in der Datei gespeichert, zu der sie gehören.
Arbeitsergebnisse von Programmen, z.B. für neue Dateien, die bisher noch gar nicht auf Massenspeicher gelangten. Solche Speicherseiten (anonymous_pages) werden beim "paging" in Swap-Bereiche ausgelagert.
Die Verfügbarkeit von Swap-Speicher erlaubt dem Kernel, diese beiden Arten von Speicherseiten gleichartig zu behandeln; dabei kann man über vm.swappiness
die Priorisierung steuern.
Für vm.swappiness
kann man einen Wert von 0 bis 200 angeben, und diese Variable bestimmt zwei Werte:
ein Maß für die Priorität der "anonymous_pages"
= vm.swappiness
(≙ 30% beim Standardwert60
)ein Maß für die Priorität der "file_pages"
= 200 - vm.swappiness
(≙ 70% beim Standardwert60
)
(Die tatsächliche Berechnung im Kernel ist komplizierter, führt aber am Ende auf diese Situation.)
Den aktuellen Wert kann man mit dem Befehl
sysctl vm.swappiness
abfragen. Der Standardwert ist 60, somit lagert der Kernel mit einer Wahrscheinlichkeit von 70% Seiten von benannten Dateien und zu 30% anonyme Seiten aus. Dieser Wert ist ein langjährig in der Praxis erprobter Kompromiss über unterschiedliche Einsatzszenarien. Der für das eigene System optimale Wert hängt ab vom konkreten Nutzungsverhalten (workload) und kann nur durch systematische Erprobung ermittelt werden.
Die Erprobung ist zeitaufwändig. Man benötigt für aussagekräftige Ergebnisse mindestens eine Woche Betrieb pro testweise eingestelltem Wert und muss natürlich in diesem Zeitraum sowohl das typische Nutzungsverhalten, aber auch Situationen mit tatsächlicher Anforderung des Swap-Speichers reproduzierbar nachstellen.
Wer die Erprobung durchführen will, startet zweckmäßig mit einer Einstellung der gleichen Wahrscheinlichkeit von 50% für beide Arten von Speicherseiten.
Die Kernel-Variable kann man so ändern:
Sofort, aber temporär bis zum Neustart mit dem Befehl:
sudo sysctl vm.swappiness=100
Beim Neustart durch eine Eintragung in der Datei /etc/default/grub als Bootoption,
oder indem man mit Rootrechten[2] eine Systemdatei anlegt:
# /etc/sysctl.d/vm.swappiness=100.conf vm.swappiness=100
Ein valider Grund zur eigenen Einstellung von vm.swappiness
sind Vorgaben von Datenbank-Systemen.
Swap überwachen¶
Es gibt mehrere Methoden zu Überwachung der tatsächlichen Nutzung des SWAP-Speichers:
Grafische Werkzeuge:
Bei Gnome startet man die Systemüberwachung, z.B. aus dem Menü „Anwendungen → Systemwerkzeuge → Systemüberwachung“ oder aus dem Übersichtsmodus durch Suche nach Systemüberwachung (meist reichen einige Anfangsbuchstaben) und Klick auf das Icon.
Bei KDE ist ein Systemmonitor im Menü in „Programme → System → Systemmonitor“ zu finden, der Reiter Systemlast zeigt mitunter auch die Swapnutzung an.
Unter Xfce kann man sich die Belegung von Swap anzeigen lassen, in dem man das Programm „System → Task Manager“ startet. Oder indem man das Plugin "Systemauslastung" zum Xfce Panel hinzufügt.
Kommandozeile:
vmstat zeigt die durchschnittliche Nutzung seit Systemstart oder seinem letzten Aufruf und kann auch die Anzeige kontinuierlich aktualisieren,
alternativ top.
free zeigt einmalig die über alle Prozesse und Swap-Bereiche summierte Nutzung,
ebenso wie, jedoch aufgelöst nach SWAP-Bereichen:
swapon --show
Eine weitere Möglichkeit:
cat /proc/swaps
Die folgende Beispielausgabe zeigt eine definierte Swap-Datei, die auch tatsächlich verwendet wird und eine Swap-Partition als zweiten Swap-Bereich:
Filename Type Size Used Priority /swapfile file 2191356 1272716 -2 /dev/sda4 partition 5242876 0 -3
Für einen einzelnen Prozess mit der beispielhaften PID
4712
erfährt man die Nutzung von SWAP und anderer Nutzung von Arbeitsspeicher aus der Datei /proc/4712/smaps. Wenn man nicht selbst Besitzer dieses Prozesses ist, muss man sudo benutzen. Zweckmäßigerweise benutzt man für solche Abfragen das Skriptswapstat
:direkter Download:swapstat ⮷
Da das Initialisierungssystem systemd für jedes in der Datei /etc/fstab aufgeführte Dateisystem auch automatisch eine Unit anlegt, kann man auch diese zur Abfrage verwenden:
systemctl status dev-sda4.swap
Beispielausgabe:
dev-sda4.swap - /dev/sda4 Loaded: loaded (/etc/fstab; generated) Active: active since Sun 2024-12-15 12:29:42 CET; 6h ago What: /dev/sda4 Docs: man:fstab(5) man:systemd-fstab-generator(8) Tasks: 0 (limit: 9321) Memory: 8.0K (peak: 600.0K) CPU: 4ms CGroup: /system.slice/dev-sda4.swap
Man erhält hier nicht nur den momentanen Wert (inkl. Overhead), sondern auch einen Eindruck der bisherigen Nutzung seit der letzten Aktivierung dieses Swap-Bereiches.
Swap leeren¶
Ein benutzter Swap-Bereich wird in der Regel im laufenden Betrieb nicht wieder geleert. Wenn man ihn leeren will, muss man ihn abmelden (→ Swap-Bereich deaktivieren) und erneut anmelden (→ swapon)
Swap deaktivieren¶
Paging deaktivieren¶
Das sollte man in der Regel und insbesondere im produktiven Betrieb nicht tun!
Achtung!
Eine Deaktivierung des Paging bringt im günstigsten Fall gar nichts (wenn das System die unter Arbeitsweise genannte Methode 3 momentan gar nicht benötigt), oder es erhöht die Wahrscheinlichkeit für eine Beauftragung des OOM-Killers (wenn das System momentan Methode 3 benötigt, aber nicht anwenden kann).
Man deaktiviert das "paging", indem man jeden Swap-Bereich einzeln abmeldet, wie folgend beschrieben.
Swap-Bereich deaktivieren¶
Achtung!
Man sollte im laufenden produktiven Betrieb nicht den letzten aktiven Swap-Bereich abmelden, weil man damit den OOM-Killer wecken könnte. Wenn eine Abmeldung des letzten aktiven Swap-Bereiches unumgänglich ist, aktivieren vorsichtige Systemverwalter vorher einen anderen Swap-Bereich.
Erst die zuständige systemd-Unit ermitteln, sofern es eine gibt:
systemctl --type swap --all
Aus der angezeigten Liste aller Swap-Bereiche muss man durch eigenes Nachdenken die richtige herausfinden, das sei beispielsweise dev-sda4.swap
. Ein Stoppen der Unit deaktiviert den Swap-Bereich:
systemctl stop dev-sda4.swap
Man wird nach dem Passwort eines Administrators gefragt.
Wenn es für den Swap-Bereich keine Unit gibt, deaktiviert man durch direkten Aufruf von swapoff:
sudo swapoff /dev/sda4
Anschließend muss der Eintrag des Swap-Bereichs in der fstab gelöscht oder zumindest durch eine voran gestellte Raute #
auskommentiert werden, damit beim nächsten Neustart der Swap-Bereich nicht wieder aktiviert wird. Zu erkennen ist der Eintrag an der Typbezeichnung swap
in der 3. Spalte:
grep swap /etc/fstab
#/dev/sda4 none swap nofail
Alternativ zum Auskommentieren kann man auch per Option noauto
in der 4. Spalte die automatischen Einbindung beim Systemstart abschalten:
/dev/sda4 none swap noauto
Alternativ kann man die beim Systemstart automatisch generierte Unit maskieren, damit sie nicht geladen wird und somit der Swap-Bereich nicht aktiviert wird:
systemctl mask "dev-sda4.swap"
(Auf die Anführungszeichen kann man verzichten, wenn der Name der Unit keine Leer- oder sonstige Sonderzeichen wie z.B. \ enthält.)
Wenn man in der Datei fstab das Dateisystem nicht mit der Gerätedatei, sondern über Label oder UUID idenifiziert hat, helfen diese Befehle bei der richtigen Zuordnung:
swaplabel /dev/sda4 lsblk -oname,label,uuid,partlabel,partuuid /dev/sda4
Eine Swap-Datei kann dann schlicht mit Rootrechten gelöscht werden.
Links¶
Virtual_memory – virteller Arbeitsspeicher bei Wikipedia
Memory Management 🇬🇧 Kapitel im "The Linux kernel user’s and administrator’s guide" der offiziellen Linux-Dokumentation
Understanding the Linux Virtual Memory Manager 🇬🇧 – Open Source Book von Mel Gorman, Stand 2007
https://wiki.debian.org/Swap 🇬🇧 – Swap im Debian-Wiki
Swap FAQ 🇬🇧
Skripte/UUID anpassen mit uuid2swap – Skript zur Korrektur falscher UUID der Swap-Partition
Swap/swapstat – Skript zur Abfrage der Nutzung von Swap pro Prozess