Es gibt viele Möglichkeiten, bei Linux einen SWAP Bereich einzurichten. Klassisch als SWAP-Partition oder SWAP-Datei. Oder als eine Art RAM-Disk als ZSWAP.
Eine weitere Möglichkeit wäre dann aber noch ZRAM. Hier wird ebenfalls der SWAP Bereich im RAM gehalten und zusätzlich noch komprimiert. Der Hauptunterschied zwischen ZRAM und ZSWAP besteht unter anderem darin, dass ZRAM kein physisches SWAP Device benötigt und besser konfigurierbar ist. Also mehr Möglichkeiten bestehen, den SWAP an die eigenen Bedürfnissen anzupassen.
Praktisch dabei ist auch, dass keinerlei Zugriffe auf Speichermedien, wie Festplatten, SSDs und NVMEs durchgeführt werden, was besonders schonend für SSDs ist.
Inhalt
1. Vorhandenen SWAP deaktivieren
Als erstes sollte geschaut werden, was an SWAP aktiviert ist. Dies kann über den Befehl swapon geschehen.
$ swapon
Es sollte dann das entsprechende SWAP Device angezeigt werden:
NAME TYPE SIZE USED PRIO /dev/nvme0n1p6 partition 977M 0B -2
Wie man hier sehen kann, ist eine SWAP-Partition auf einer NVMe vorhanden. Dazu passend wird es auch einen Eintrag in der /etc/fstab geben. Bei mir ist die UUID des Devices /dev/nvme7n1 und der 6. Partition eingetragen:
... # swap was on /dev/nvme7n1p6 during installation UUID=24ebb98c-36ac-4bd1-91c4-8563ff458c3f none swap sw 0 0 ...
Dieser Eintrag sollte natürlich auskommentiert werden, indem man einfach vor diese Zeile ein “#” eingefügt wird.
Ebenfalls muss der ZSWAP abgeschaltet werden, damit dieser nicht dazwischen funken kann:
$ sudo bash -c "echo 0 > /sys/module/zswap/parameters/enabled"
Danach schaltet man auf der Konsole jeglichen SWAP erst einmal aus:
$ sudo swapoff --all
2. ZRAM aktivieren
Erster Schritt ist das Laden des ZRAM Moduls:
$ sudo modprobe zram num_devices=1
Es gibt verschiedene Algorithmen, die für die Kompression verwendet werden kann. Um sich anzuschauen, welche verfügbar sind, gibt man folgendes in die Konsole ein:
$ cat /sys/block/zram0/comp_algorithm
Und erhält eine Ausgabe in der Form:
lzo lzo-rle lz4 lz4hc 842 zstd
Ich wähle den ZSTD Kompressions-Algorithmus aus:
$ sudo bash -c "echo zstd > /sys/block/zram0/comp_algorithm"
Da ich mit 256GB recht viel RAM zur Verfügung habe, lege ich mir einen 32GB großen Swap Bereich an. Übrigens werden diese 32GB nicht für Linux ansonsten gesperrt, sondern das ganze wird dynamisch verwaltet. Sollte eine Anwendung sehr viel RAM benötigt, wird für diesen Zeitraum der Swap automatisch verkleinert und später wieder für Swap zugewiesen.
$ sudo bash -c "echo 32G > /sys/block/zram0/disksize"
Jetzt sollte noch einmal kontrolliert werden, ob die Eingaben auch übernommen wurden:
$ cat /sys/block/zram0/comp_algorithm $ cat /sys/block/zram0/disksize
Darauf sollte dann folgendes ausgegeben werden:
$ cat /sys/block/zram0/comp_algorithm lzo lzo-rle lz4 lz4hc 842 [zstd] $ cat /sys/block/zram0/disksize 34359738368
Jetzt noch den Swap aktivieren und die höchste Priorität zuweisen:
$ sudo mkswap --label zram0 /dev/zram0 $ sudo swapon --priority 32767 /dev/zram0
Mit dem Befehel zramctl kann man sich nun den konfigurierten Swap anschauen:
$ zramctl
Und man bekommt den zugewiesenen Swap angezeigt:
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT /dev/zram0 zstd 32G 3.5G 353.1M 567.9M 16 [SWAP]
3. ZRAM SWAP automatisch beim Rechnerstart anlegen
Wenn der Rechner jetzt neu gestartet würde, wäre der SWAP im RAM wieder deaktiviert. Da hier kein physisches SWAP Device vorhanden ist, welches einfach in die /etc/fstab eingetragen werden, muss man bei jedem Start des Rechners den SWAP wieder neu anlegen. Dies kann man automatisch durch entsprechende Skripte ausführen lassen.
3.1 Startskript
Es werden zwei Skripte benötigt, eines zum starten und eines zum beenden des ZRAM. Als erstes wird das Startskript angelegt. Dazu wird eine neue Datei mit dem Namen zram_start unterhalb von /usr/local/bin anlegen:
$ sudo vim /usr/local/bin/zram_start
Und den folgenden Inhalt einfügen und anschließend abspeichern:
#!/bin/bash # Kompressions Algorithmus festlegen echo zstd > /sys/block/zram0/comp_algorithm # 32GB großer zram0 SWAP im RAM anlegen echo 32G > /sys/block/zram0/disksize # Aktivieren des zram0 SWAP und höchste Priorisierung zuweisen mkswap --label zram0 /dev/zram0 swapon --priority 32767 /dev/zram0
Es fehlen noch die Ausführrechte für dieses Skript, welche wie folgt hinzugefügt werden:
$ sudo chmod a+x /usr/local/bin/zram_start
3.2 Stopskript
Damit der Swap auch beendet werden kann, zum Beispiel beim herunterfahren des Rechners, wird ein weiteres Skript benötigt. Dazu wird eine weitere Datei zram_stop wieder unterhalb von /usr/local/bin angelegt:
$ sudo vim /usr/local/bin/zram_stop
Dort wird dann folgender Inhalt eingefügt und abgespeichert:
#!/bin/bash # SWAP abschalten swapoff /dev/zram0 # ZRAM0 Device resetten und leeren echo 1 > /sys/block/zram0/reset
Und auch hier die entsprechenden Ausführrechte hinzufügen:
$ sudo chmod a+x /usr/local/bin/zram_stop
3.3 Dienst unter SYSTEMD einrichten
Damit die beiden zuvor angelegten Skripte beim starten und herunterfahren des Rechners automatisch ausgeführt werden, wird jetzt noch ein entsprechender Dienst eingerichtet. Dazu wird ein Shell-Skript unterhalb von /etc/systemd/system erstellt:
$ sudo vim /etc/systemd/system/zram-swap.service
Dann den folgenden Code dort einfügen und die Datei abspeichern:
[Unit] Description=Configure zram swap device After=local-fs.target [Service] Type=oneshot ExecStart=/usr/local/bin/zram_start ExecStop=/usr/local/bin/zram_stop RemainAfterExit=yes [Install] WantedBy=multi-user.target
Dieser neue Dienst muss jetzt noch eingeschaltet werden:
$ sudo systemctl enable zram-swap
Anschließend noch überprüfen, ob alles fehlerfrei ausgeführt worden ist:
$ sudo systemctl status zram-swap
4. Kernel Parameter einstellen
Um das ganze noch etwas zu optimieren können ein paar Kernel Parameter verändert werden. Dazu werden folgende Parameter angepasst:
vm.vfs_cache_pressurevm.swappinessdirty_background_ratiodirty_ratio
Der Parameter vm.vfs_cache_pressure (Defaultwert: 100) erhöht die Häufigkeit, mit dem der Cache des virtuellen Filesystems geleert wird, um RAM freizugeben. Der vm.swappiness-Parameter (Default: 60) steuert die Tendenz des Kernels, Prozesse aus dem physischen Speicher auf den SWAP Speicher zu verschieben. Dadurch wird der ZRAM schneller verwendet. Und um die I/O Performance noch anzupassen, dienen die beiden Parameter vm.dirty_background_ratio (Default: 10) und vm.dirty_ratio (Default: 20).
Damit die Parameter automatisch beim Systemstart geändert werden, wird unterhalb von /etc/sysctl.d die Datei 99-sysctl.conf angelegt, bzw. wenn schon vorhanden, editiert:
$ sudo vim /etc/sysctl.d/99-sysctl.conf
Bei mir sieht die Datei so aus:
vm.vfs_cache_pressure=500 vm.swappiness=100 vm.dirty_background_ratio=1 vm.dirty_ratio=50
Diese Parameter können entsprechend abweichend angepasst werden.
Quellen:
https://wiki.archlinux.org/title/zswap
https://wiki.archlinux.org/title/Zram
https://wiki.archlinux.org/title/Swap
https://wiki.archlinux.org/title/Sysctl
