Swap

Linux lagert (swapped) inaktive Prozesse aus dem Hauptspeicher in seine Swap-Partitionen oder -Dateien aus. Sind die Prozesse wieder aktiv, werden sie aus dem Swap-Bereich zurück in den Speicher geladen. Sind mehrere Swap-Partitionen und/oder -Dateien vorhanden, füllt Linux zunächst den ersten Swap-Bereich komplett, bevor es nacheinander die anderen verwendet. In der Regel geschieht diese teure und langsame Aktion erst, wenn zu wenig Hauptspeicher vorhanden ist.

Linux kann auch ohne Swap arbeiten - falls kein Hauptspeicher zur Verfügung steht, fällt es in den „Kernel Panic“ Modus und startet seinen Out-of-Memory-Killer (OOM), bevor es den Kernel stoppt. Auf Swap-Space zu verzichten ist auf Embedded Systemen durchaus üblich, in der Praxis auf Servern jedoch nicht zu empfehlen.

Empfohlene Swap-Grössen:

RAM

Swap Space

<= 2 GB

2x RAM

2..8 GB

wie RAM

8..64 GB

>= 4 GB

> 64 GB

>= 4 GB

Um festzustellen, wieviel Swap-Space zur Verfügung steht, und wie dieser ausgelastet ist, genügt folgendes Kommando:

grep Swap /proc/meminfo
# or
free -m
# or
top

Keine Panik: nur weil die Swap-Datei belegt ist, heisst das noch lange nicht, dass die Maschine auch aktiv swappt. Vieles davon kann auch gecached sein, d.h. dass aus Performance-Gründen Speicher für eine Anwendung im Hauptspeicher UND im Swap alloziert ist.

Wo liegt der Swap-Space?

swapon --summary
# or
cat /proc/swaps

Welcher Swap-Space wird mit welcher Priorität verwendet?

swapon --show

Wieviel Cache wird im Swap-Space verwendet?

grep SwapCached /proc/meminfo

Ab wann swappt die Maschine / ab wann wird Swap-Space genutzt? Der Kernel kennt dafür den Begriff „Swappiness“.

cat /proc/sys/vm/swappiness

Ein Wert „30“ bedeutet, dass ab 30% freiem Memory und weniger geswappt wird. Ein Wert von „0“ bedeutet, unter allen Umständen Swap-Space zu vermeiden, was meist auf Embedded Systeme konfiguriert wird.

So setzt man die Swapiness auf 10:

/etc/sysctl.conf
vm.swappiness = 10
sysctl -p

Um festzustellen, ob die Maschine aktiv Hauptspeicher auf die Festplatte auslagert, kann das Kommando

vmstat 1

aufgerufen werden. Die Spalten „si“ (Swap in = Disk to RAM) und „so“ (Swap out = RAM to Disk) geben darüber Auskunft.

Welcher Prozess verwendet Swap-Space?

for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less

Um aktuell verwendeten Swap-Space wieder zurück ins RAM zu kopieren, kann man den Swap-Space de- und wieder aktivieren. Aber Vorsicht: man sollte mit vmstat 1 tunlichst darauf achten, dass gerade nicht geswappt wird - sonst wird der OOM aktiv:

cat /proc/meminfo | grep -i swap
swapoff --verbose --all && swapon --verbose --all
cat /proc/meminfo | grep -i swap

Geduld: swapoff braucht auf manchen Systemen etliche Minuten, falls beispielsweise viel Cached Swap-Space allokiert wurde (dieser wird bei swapoff in homöopathischen Dosen freigegeben). Ein swappoff lastet zudem einen CPU-Core zu 100% aus. Auf einem KVM-Server dauerte der Vorgang bei knapp 4 GB SwapCached, 400 MB SwapFree und 16 GB SwapTotal über 2 Stunden, die Maschine blieb aber nutz- und ansprechbar.

Swap-Partition vergrössern

LVM-Name der bestehenden Swap-Partition ermitteln:

blkid | grep swap
df -hT

Im Beispiel heisst die Partition /dev/mapper/centos-swap. Vor der Erstellung auf Bad Blocks prüfen.

swapoff --verbose /dev/mapper/centos-swap
lvresize /dev/mapper/centos-swap --size +4G
mkswap --check /dev/mapper/centos-swap
swapon --verbose --all

Swap-Partition hinzufügen

Um eine Swap-Partition zu erstellen, legt man beispielsweise mit fdisk eine Partition vom Typ „82“ (= Linux swap / Solaris) an. Danach wird die Swap-Partition aktiviert, im Beispiel auf /dev/vdc3:

mkswap --check /dev/vdc3
swapon /dev/vdc3

Die Swap-Partition ist erstellt und mit letztem Befehl sofort aktiv geschaltet worden. Jetzt dauerhaft in die /etc/fstab eintragen:

blkid /dev/vdc3
/etc/fstab
# higher number means higher prio
UUID="ab-...-OmKggh" swap swap defaults 0 0
UUID="gh-...-OmKggh" swap swap pri=10 0 0
UUID="xy-...-OmKggh" swap swap pri=20 0 0

Eine Überprüfung mit swapon --summary zeigt, wo welcher Swap-Space in welchem Umfang verwendet wird.

Swap-Datei hinzufügen

Prinzipiell spielt es keine Rolle, ob für den Swap-Space eine Partition oder eine Datei genommen wird. Daher liesse sich mit

dd if=/dev/zero of=/swapfile bs=1G count=4
# the above command needs round about 10 seconds
chmod 0600 /swapfile

eine 4 GB grosse, mit Nullen gefüllte Datei anlegen, die sich mit mkswap und swapon genauso gut als Swap-Space eignet.

mkswap /swapfile
sync
swapon /swapfile
/etc/fstab
/swapfile swap swap defaults 0 0

Tipp

Fehlermeldung swapon failed: Device or resource busy? Das Device ist nicht busy, die Datei ist einfach noch nicht da und kann deswegen nicht als Swap-Space aktiviert werden. In diesem Fall hilft der Aufruf von sync vor swapon, um die mit mkswap erzeugte Datei auch wirklich auf die Festplatte zu schreiben.

Swap-Datei entfernen

swapoff --verbose /swapfile
rm -f /swapfile

Built on 2022-12-06