[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:Partitionierung: Partition einrichten] }}} [[Inhaltsverzeichnis()]] [[Bild(Wiki/Icons/hd.png, 48, align=left)]] 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. 1. 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. 1. 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. 1. 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-ueberwachen 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 [:Ruhezustand: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 [:Laufwerksverwaltung:Laufwerke], den Befehlen für die Kommandozeile[1] [:fdisk:], [:gdisk:], [:GNU Parted: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: [[Vorlage(Befehl, "sudo partprobe" ) ]] Bei KDE-Systemen kann man benutzen: [[Vorlage(Befehl, "sudo kpartx" ) ]] Die neue Partition muss man noch [#mkswap formatieren]. Eine Swap-Partition wird nicht via [:mount:] eingebunden, sondern mit dem Befehl [#swapon `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: * [:ext:ext2/3/4] ist verwendbar. * [wikipedia:XFS_(Dateisystem):XFS] ist verwendbar. * [:Btrfs:] ist eingeschränkt verwendbar: Es muss entweder generell das Attribut `nocow` gesetzt und damit die Eigenschaft "copy-on-write" ausgeschaltet werden oder man muss das gemäß der [https://btrfs.readthedocs.io/en/latest/Swapfile.html Dokumentation von Btrfs] {en} speziell für die Auslagerungsdatei machen. Solange eine Auslagerungsdatei auf einem Subvolume aktiv ist, kann davon kein Snapshot erstellt werden – was einen der großen Vorteile von Btrfs zunichte macht bzw. verkompliziert. * 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: \\ [[Vorlage(Befehl, "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. 1. Die Datei soll [:root:] gehören und nur dieser soll sie lesen können: \\ [[Vorlage(Befehl, "sudo chown root:root /swapfile ; sudo chmod 0600 /swapfile" ) ]] 1. Vor ihrer ersten Aktivierung als Swap-Bereich muss man die Datei als SWAP mit [#mkswap mkswap] formatieren. == Dynamisch wachsender Swap == Anstelle statisch definierte 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 [http://pqxx.org/development/swapspace/ Swapspace] {en} wird nicht mehr weiterentwickelt. Es gibt aber einen Fork mit dem gleichen Namen in den offiziellen Paketquellen von Ubuntu: {{{#!vorlage Paketinstallation swapspace, universe }}} Die Grundkonfiguration von `Swapspace` braucht nicht weiter angepasst zu werden. {{{#!vorlage 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 [wikipedia_en:Zswap:`zswap`] und `zcache` sowie [wikipedia_en:Zram:`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] {en} * 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] {en} \\ -> [https://docs.kernel.org/admin-guide/blockdev/zram.html] {en} Ubuntu Kernel enthalten `zswap` als fest eingebaute, aber standardmäßig nicht aktivierte Funktionalität, und `zram` ist als nachladbarer Modul verfügbar. -> [:zRam: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 [[Vorlage(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 2^^(32)^^-1, d.h. die größte mit 32 Bit darstellbare ganze Zahl. Man kann bei der Formatierung optional [:UUID:] und/oder [:Labels:Label] vergeben oder das später mit [#swaplabel `swaplabel`] nachholen. {{{#!vorlage warnung Nach der [:Formatieren:Formatierung] durch `mkswap` ist eine Wiederherstellung bereits gespeicherter Daten 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: [[Vorlage(Befehl, "sudo mkswap /dev/sda99" ) ]] Das funktioniert genauso auch mit einer Auslagerungsdatei: [[Vorlage(Befehl, "sudo mkswap /swapfile" ) ]] Dabei muss die hier beispielhaft angegebene Datei '''/swapfile''' bereits existieren und die oben genannten [#Swap-Datei-erstellen technischen Restriktionen] erfüllen. == swapon == Der Befehl `swapon` aktiviert einen Swap-Bereich. {{{#!vorlage Warnung 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: [[Vorlage(Befehl, "sudo swapon /dev/sda99" ) ]] * oder bei Swap-Datei: [[Vorlage(Befehl, "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 [:SSD/TRIM#SWAP: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 [:fstab:/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 [:Labels:Label] identifizieren. == swapoff == Der Befehl `swapoff` deaktiviert einen Swap-Bereich. Die Ausführungen zu [#swapon swapon] gelten sinngemäß. == swaplabel == Man kann dem errichteten Swap-Dateisystem ein [:Labels:Label] geben oder ein bestehendes ändern und/oder dessen [:UUID:] ändern, beispielsweise: * [[Vorlage(Befehl, "sudo swaplabel /dev/sda99" ) ]] Abfrage von UUID und Label (sofern gesetzt) * [[Vorlage(Befehl, "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. * [[Vorlage(Befehl, "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. [[Anker(swappiness)]] = 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 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. 1. 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 [[Vorlage(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: [[Vorlage(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: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: [[Vorlage(Befehl, "swapon --show" ) ]] * Eine weitere Möglichkeit: [[Vorlage(Befehl, "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`: * [:Swap/swapstat:Beschreibung und Anleitung] * direkter Download:[[Anhang('swapstat' ) ]] {dl} * 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: [[Vorlage(Befehl, "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: [mark]8.0K (peak: 600.0K)[/mark] 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 Swap-Bereich deaktivieren]) und erneut anmelden (-> [#swapon swapon]) = Swap deaktivieren = == Paging deaktivieren == Das sollte man in der Regel und insbesondere im produktiven Betrieb nicht tun! {{{#!vorlage Warnung Eine Deaktivierung des Paging bringt im günstigsten Fall gar nichts (wenn das System die unter [#Arbeitsweise 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 == {{{#!vorlage Warnung 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/#Units:systemd-Unit] ermitteln, sofern es eine gibt: {{{#!vorlage Befehl 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: [[Vorlage(Befehl,"systemctl stop dev-sda4.swap" ) ]] Man wird nach dem Passwort eines [:Administrator:Administrators] gefragt. Wenn es für den Swap-Bereich keine Unit gibt, deaktiviert man durch direkten Aufruf von [#swapoff swapoff]: [[Vorlage(Befehl,"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: [[Vorlage(Befehl,"grep swap /etc/fstab" ) ]] {{{[mark]#[/mark]/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 [mark]noauto[/mark] }}} Alternativ kann man die beim Systemstart automatisch generierte [:systemd/Units/#Laden-von-Units-komplett-verhindern:Unit maskieren], damit sie nicht geladen wird und somit der Swap-Bereich nicht aktiviert wird: [[Vorlage(Befehl, "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 [:Root-Rechte:Rootrechten] gelöscht werden. = Links = * [wikipedia_en:Virtual_memory:] – virteller Arbeitsspeicher bei Wikipedia * [https://www.kernel.org/doc/html/latest/admin-guide/mm/index.html Memory Management] {en} Kapitel im "The Linux kernel user’s and administrator’s guide" der offiziellen Linux-Dokumentation * [https://www.kernel.org/doc/gorman/pdf/understand.pdf Understanding the Linux Virtual Memory Manager] {en} – Open Source Book von Mel Gorman, Stand 2007 * [https://wiki.debian.org/Swap] {en} – Swap im Debian-Wiki * [ubuntu_doc:community/SwapFaq:Swap FAQ] {en} * [:Skripte/UUID_anpassen_mit_uuid2swap:] – Skript zur Korrektur falscher UUID der Swap-Partition * [:Swap/swapstat:] – Skript zur Abfrage der Nutzung von Swap pro Prozess # tag: System, Datenträger