ubuntuusers.de

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:

Wiki/Icons/hd.png 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:

    1. 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.

    2. 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.

    3. 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.

    4. 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 zu 82) bei Benutzung des Partitionsschemas DOS/MBR,

  • 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F bei Benutzung des GPT-Schemas an. (gdisk erlaubt aber dafür auch die Angabe 8200.)

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):

  1. 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.

  2. Die Datei soll root gehören und nur dieser soll sie lesen können:

    sudo chown root:root /swapfile ; sudo chmod 0600 /swapfile 
  3. 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 ist zcache. 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:

  1. 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.

  2. 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 Standardwert 60)

  • ein Maß für die Priorität der "file_pages" = 200 - vm.swappiness (≙ 70% beim Standardwert 60)

(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 Skript 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.

Diese Revision wurde am 28. Dezember 2024 11:20 von kB erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: System, Datenträger