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:
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.
Links¶
Intern¶
zRam - zusätzlichen Swap im Arbeitsspeicher (RAM) anlegen
Skripte/UUID anpassen mit uuid2swap - Fehlerhafte UUID der Swap-Partition schnell korrigieren
Extern¶