staging.inyokaproject.org

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 Linux (wie so gut wie alle anderen Betriebssysteme) versucht, die Betriebssystemkomponenten, aktuell benötigte Programmdaten u.a. im RAM (Arbeitsspeicher) zu halten, da der Zugriff auf das RAM deutlich schneller ist als auf Datenträger wie Festplatte, CD oder USB-Stick.

Nun kann es aber vorkommen, dass das komplette RAM voll ist, weil z.B. (sehr) viele Programme gleichzeitig geöffnet sind. An dieser Stelle beginnt der Linux-Kernel, RAM frei zu machen, indem er Teile der im RAM gespeicherten Daten auf die Festplatte schreibt. Werden die Daten wieder benötigt, so werden diese wieder ins RAM geladen und andere im Moment nicht benötigte Daten werden in den Swap geschrieben. In einem solchen Fall sagt man auch: „das System swappt“.

Nutzt ein System den Swap intensiv, so wird das System durch die häufigen Plattenzugriffe deutlich langsamer und fühlt sich „zäh“ an. Hat man allerdings keinen Swap und das RAM läuft voll, so beendet der Linux-Kernel nach eigenem Ermessen Programme, um RAM frei zu machen. Dies hat in der Regel Datenverlust zur Folge. Um genau dies zu verhindern, legt Ubuntu (so wie alle anderen Distributionen) bei der Installation standardmäßig einen Swap-Bereich (= Auslagerungsbereich) an. Neuere Ubuntu-Versionen verwenden hierbei eine Swap-Datei. Verwendet man noch Xenial oder hat man von einer älteren Ubuntu-Version ein Upgrade durchgeführt, wird statt der Swap-Datei noch eine Swap-Partition verwendet. Dies hat in der Regel keinen Nachteil, es unterscheidet sich aber die Handhabung in manchen Details.

Swapgröße

Die passende Speichergröße hängt von mehreren Faktoren ab und kann nicht im Allgemeinen angegeben werden. Je nach Systemnutzung reichen schon in etwa 1 GB Swapspeicher bzw. für Suspend-to-Disk 1 GB + RAM-Kapazität. Falls der Swapspeicher (und RAM) volllaufen, stürzt das System unter Umständen ab und alle nicht mit der Festplatte synchronisierten Daten sind verloren, weswegen auch ein großzügiger angelegter Swapbereich sinnvoll sein kann.

Swap anlegen

Wie oben bereits erwähnt, legt K|X|Ubuntu standardmäßig automatisch einen Swap-Bereich an, d.h. man muss nichts weiter machen. Wie man einen neuen Swap-Bereich anlegt, wird im folgenden Abschnitt beschrieben.

Swap-Partition erstellen

Achtung!

Durch mkswap wird die angegebene Partition formatiert. Eine Wiederherstellung auf der Partition gespeicherter Daten ist nur schwer (oder gar nicht) möglich. Man sollte sich also sicher sein, dass man die richtige Partition angibt.

Falls man eine Swap-Partition neu erstellen möchte und das bei der Installation vergessen hat, erstellt man eine Swap-Partition [3] und formatiert diese mit Hilfe des Befehls mkswap:

sudo mkswap /dev/xxxx 

Anschließend kann die Partition eingebunden werden. Dazu ermittelt man zunächst die UUID der Partition mit

ls -l /dev/disk/by-uuid 

und bindet diese mit dem Befehl

sudo swapon -U UUID 

ein. Um die Partition dauerhaft einzubinden, öffnet man die Datei /etc/fstab mit Root-Rechten.[2] In der Datei fügt man folgende Zeile ein, welche entsprechend angepasst werden muss:

UUID=.... none swap sw 0 0

Swap-Datei erstellen

Mit Hilfe des Programms dd kann eine Auslagerungsdatei erstellt werden. Im folgenden Beispiel ist diese 8 GiB groß (8192 Blöck mit einer Größe von 1 MiB):

sudo dd if=/dev/zero of=/swapfile bs=1M count=8192 

Experten-Info:

Die Zeile besagt, dass eine Datei mit dem Namen swapfile im Dateisystem unter / mit 8192 MiB Größe angelegt wird. Die Größe ergibt sich aus 1M×8192 = 8192 MiB, wobei 1M im Befehl dd gleich 1024×1024 Byte = 1 MiB entspricht. Der Wert 8192 ist der count aus dem dd-Befehl. Siehe auch: Vergleichstabelle-Binärpräfixe gemäß IEC

Es ist wichtig, dass die Datei so angelegt wird, da sie dann auf der Festplatte durchgehend nur durch leere Speicherstellen besteht und keine zufälligen Daten enthält. Mehr in den Manpages von Shell/dd und zero.

Hinweis:

Grundsätzlich könnte man eine Auslagerungsdatei mit dem Programm fallocate erstellen. Dieses Vorgehen kann aber zu Problemen bei Dateisystemen wie ext4 (Standard bei Ubuntu), btrfs und XFS führen, weswegen von der Nutzung von fallocate abgeraten wird. In der Manpage von mkswap wird ebenfalls explizit von der Nutzung von fallocate abgeraten und die Nutzung von dd empfohlen.

Um nicht jedem beliebigen Benutzer die Möglichkeit zu geben, den Swap auszulesen, sollte man

sudo chmod 0600 /swapfile 

ausführen. Das setzt die Rechte für alle Benutzer außer root auf "kein Lesen, kein Schreiben, kein Ausführen".

Um den Speicher zu formatieren, gibt man folgendes ein:

sudo mkswap /swapfile 

Die Warnung kann man dabei ignorieren. Damit das System über den Swap Bescheid weiß, gibt man einfach

sudo swapon /swapfile 

ein. Ein Neustart ist nicht notwendig.

Sicher will man die Auslagerungsdatei auch nach einem Neustart wieder verwenden. Dazu einfach die Datei /etc/fstab in einem Editor[2] mit Root-Rechten öffnen und dort diese Zeile anhängen:

/swapfile    none    swap    sw      0 0

Dynamisch wachsender Swap

Man kann auch eine dynamische Auslagerungsdateiverwaltung installieren, die nach Bedarf mehrere kleinere Auslagerungsdateien in einem Ordner anlegt. Dazu wird das Programm Swapspace 🇬🇧 benötigt:

  • 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, da hier der gesamte "resume"-Bereich am Stück vorliegen muss.

⚓︎

Swapnutzung einstellen

Es lässt sich festlegen, wann der Kernel Daten aus dem Arbeitsspeicher in die Swap-Partition bzw. Swap-Datei verschiebt. Die swappiness wird mit einem Wert von 0 bis 100 angegeben, wobei mit 0 nicht ausgelagert wird. Es besteht das Risiko, dass der Arbeitsspeicher bei speicherintensiven Anwendungen voll läuft und das System einfriert, während mit 100 der Arbeitsspeicher kaum genutzt wird. Der Standardwert ist 60, der Kernel neigt also eher zum Auslagern. Pauschal lässt sich kein Wert empfehlen, da es auf das jeweilige System und das Benutzerverhalten ankommt. Dies zeigt auch diese Diskussion 🇬🇧 bei welcher man sich praktisch nicht einigen konnte.

Hat das System mehr als 2 GiB Arbeitsspeicher und hantieren die Benutzer nicht mit schwerfälligen Programmen (Bild-/Videobearbeitung, Datenkompression, aufwändig gestaltete Spiele o.ä.), könnte es von Nutzen sein, die swappiness klein zu halten. Andererseits sollte jedoch darauf geachtet werden, dass die Kapazität des Arbeitsspeichers nicht verschwendet wird. Wurde die swappiness sehr niedrig gesetzt und laufen z.B. viele Programme parallel, kann es leicht passieren, dass der Arbeitsspeicher fast voll ist und genau dann ein Programm gestartet wird, das den Arbeitsspeicher besonders stark belastet. Nun ist der Speicher ausgeschöpft und das System muss nicht nur das ohnehin schwerfällige Programm laden, sondern gleichzeitig auch noch auslagern. Resultat ist ein völlig ausgelastetes System.

Mit folgendem Befehl lässt sich der aktuelle Wert der swappiness herausfinden:

sysctl vm.swappiness 

Das Ergebnis könnte so aussehen:

vm.swappiness = 60

Um die swappiness sofort zu ändern, bspw. auf 25 abzusenken, verwendet man diesen Befehl:

sudo sysctl vm.swappiness=25 

Diese Änderung wird vom System jedoch nach einem Neustart vergessen, wenn nicht folgendes in die Systemdatei /etc/sysctl.conf eingetragen wird[2]:

vm.swappiness=25

Swap überwachen

Mit

swapon -s 

kann man jederzeit den Zustand des Swap überprüfen. Dazu sind normalerweise auch keine Root-Rechte notwendig, d.h. auch unprivilegierte Benutzer können den Befehl ausführen. Bleibt die Ausgabe leer, ist kein Swap-Bereich eingerichtet.

Zeigt die Ausgabe einen Eintrag wie

swapon -s
Filename                                Type            Size    Used    Priority
/swapfile                               file            20971516        1272716 -2

ist eine Swap-Datei definiert.

Der Befehl zeigt den Inhalt der Datei /proc/swaps an. Weitere Möglichkeiten, die Swap-Nutzung anzuzeigen, bieten die Befehle free oder auch top. Letzterer aktualisiert die Anzeige kontinuierlich.

Grafische Werkzeuge

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 in dem man das Plugin "Systemauslastung" zum Xfce Panel hinzufügt.

Swap leeren

Der Swap ist nach dem Starten des Systems unbenutzt. Möchte man den Swap im laufenden Betrieb leeren, muss der Swap zunächst de- und dann wieder aktiviert werden. Ist der Swap in der /etc/fstab eingetragen, lauten die Befehle hierfür:

sudo swapoff -a  ## Swap ausschalten
sudo swapon -a   ## Swap einschalten 

Zwischendurch kann man über ein weiteres Terminalfenster das Leeren des Swaps beobachten:

free -s 3 |grep Swap 

oder einfach

top 

Falls es nur um eine spezielle Swap-Partition gehen soll, z.B. sda2, lauten die Befehle entsprechend:

swapoff /dev/sda2
swapon /dev/sda2 

Swap deaktivieren

Erst die zuständige systemd-Unit ermitteln:

sudo systemctl --type swap 

Anschließend sollte das Auslagern beendet werden:

sudo swapoff -a 

...und maskieren, damit sie beim Systemstart nicht mehr geladen wird:

sudo systemctl mask "UNIT_DATEI" 

(Auf die Anführungszeichen kann man verzichten, wenn der Name der Unit-Datei keine Leer- oder sonstige Sonderzeichen wie z.B. \ enthält.)

Abschließend muss der Eintrag der Swap-Datei/-Partition in der fstab gelöscht oder zumindest durch eine voran gestellte # auskommentiert werden. Zu erkennen ist der Eintrag an der Typenbezeichnung swap in der Spalte <type>.

1
2
3
# <file system>                            <mount point>   <type>       <options>                           <dump>  <pass>
UUID=03b77228-ed4c-4218-910e-11b9f77c4b46  /               ext4     defaults                              0       1
# UUID=8883dbc8-80f8-49b8-8c5f-13a32baefe98  none            swap         sw                                  0       0

Eine Swap-Datei kann dann schlicht mit Root-Rechten gelöscht werden. Nach dem Entfernen einer Swap-Partition will man anschließend wahrscheinlich eine andere vergrößern, siehe dazu Partitionierung.

Intern

Extern

Diese Revision wurde am 26. Mai 2023 12:54 von kB erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: System, Datenträger