Caramon2
Lieutenant
- Registriert
- Jan. 2004
- Beiträge
- 879
WICHTIG!
Inzwischen (27.10.2022) rate ich von zSwap ab!
Alles was ich bisher dazu geschrieben habe ist damit gegenstandslos.
Nach meinen Erfahrungen (s. u.) ist das eine nutzlos Verschwendung von Arbeitsspeicher, weil dadurch früher ausgelagert werden muss und die Schreiblast sogar steigt: zSwap funktioniert offenbar nur als Lese-Cache, während ausgelagerte Seiten gleich in die Swap geschrieben werden. - Dass die Swap nicht genutzt wird, wenn zSwap ausreichend groß ist, wie man oft dazu liest, ist falsch.
Ich habe das unter Artix (Arch-Derivat) mit Kernel 5.16 und 6.0 getestet.
Da es lt. Arch-Wiki (hier und hier) standardmäßig aktiviert ist, muss es (als Root) in "/etc/default/grub" deaktiviert werden (+ "update-grub"):
Das sollte man immer machen, auch wenn die genutzte Distribution es (noch?) nicht standardmäßig aktiviert: Das kann ja noch kommen.
Nochmal: Egal ob normale Swap-Datei/-Partition, oder zRAM: zSwap muss deaktiviert sein.
Dass es die Speicherseiten zwar im RAM komprimiert speichert, es dann aber wieder unkomprimiert auf Platte schreibt, war mir schon immer suspekt, weshalb ich mich nicht früher damit beschäftigt habe.
zRAM nutze ich dagegen schon seit dem ich 2014 bei meinem gerooteten Huawei Y300 (512 MiB RAM, Android 4.4: CyanogenMod) erstmals darauf gestoßen bin.
Auf dem PC nutze ich Linux seit 2015, da mir Windows XP (x64) nicht mehr tragbar erschien: zuerst LinuxMint bis 2020 (18.3), dann Artix.
Grundlagen:
Es können diese Kompressionen genutzt werden: lzo lzo-rle lz4 lz4hc 842 zstd
Sinnvoll sind aber nur lz4 und zstd:
lzo komprimiert so schnell und schlecht wie lz4, dekomprimiert aber so weniger schnell wie zstd (lahm entpackt zstd ja auch nicht, komprimiert aber viel besser) und das "-rle" ändert daran auch nichts relevantes. Dto. lz4hc (=high compression): Bringt fast nichts, ist nur deutlich langsamer. 842 ist vollkommener Blödsinn.
Bei einer Swap (egal ob zSwap oder zRAM) nutze ich zstd, da das auslagern ja im Hintergrund passiert: Die Geschwindigkeit ist also unwichtiger, als eine gute Kompression. - Wichtig ist dabei auch, dass die Daten im Arbeitsspeicher unkomprimiert vorliegen, also besonders gut gepackt werden können. (z. B. ein JPG muss ja dekodiert werden, um es anzuzeigen: Im RAM ist es quasi ein unkomprimiertes BMP)
Anders bei einer zRAM-Disk: Dorthin kopiert man die gleichen Daten wie auf der Platte, also JPG als JPG, usw. - Da würde eine hohe Kompression oft nicht greifen und zstd würde nutzlos bremsen. Deshalb nutze ich dort vorzugsweise lz4.
zstd komprimiert normalerweise etwas besser als 1:3, während lz4 kaum 1:2 schafft.
Deshalb nutze ich für zSwap 25% des RAMs, was sich mit 4 GiB RAM am einfachsten veranschaulichen lässt:
Von den 4 GiB RAM wird 1 GiB für zSwap reserviert, worin sich mit zstd das dreifache speichern lässt: Also praktisch 3 GiB RAM + 3 GiB zSwap: Aus 4 GiB werden sozusagen 6 GiB.
Dto. bei zRAM, nur dass es andersherum rechnet: Das lege ich mit 75% der RAM-Größe an, was dann aber durch zstd nur 1/3 davon belegt: Bei 4 GiB RAM wird zRAM also 3 GiB groß, belegt (wenn voll) durch die Komprimierung aber nur 1 GiB, so dass man wieder auf 3 GiB + 3 GiB. kommt.
WICHTIG:
zRAM sollte ausschließlich ohne Swap-Partition/-Datei genutzt werden:
Das Problem daran ist: Wenn der Speicher voll wird, zuerst das unwichtigste ausgelagert wird und das zRAM füllt. Wenn dann auch noch Teile der aktuell genutzten Daten ausgelagert werden müssen, ist das zRAM schon voll und sie kommen in die Swap: Also gerade die Daten, auf die ggfs. schnell wieder zugegriffen werden müssen, sind auf der lahmen Platte, weil die alten/unwichtigen Daten das zRAM blockieren.
Wenn man eine physikalische Swap braucht (z. B. für den Ruhezustand), bleibt nur zSwap (das funktioniert ausschließlich mit Swap): Da es als Cache für die Swap arbeitet, sind die aktuellen Daten immer dort, während die älteren Daten, wenn es knapp wird, in die Swap durchgereicht werden (bekloppterweise aber wieder unkomprimiert), so dass obiges Problem nicht entsteht.
Hier noch ein paar Links:
https://www.kernel.org/doc/Documentation/admin-guide/blockdev/zram.rst
https://www.kernel.org/doc/Documentation/admin-guide/mm/zswap.rst
https://www.kernel.org/doc/Documentation/vm/z3fold.rst
Anwendung (als Root):
zRAM-Swap nutze ich per "/etc/rc.local" (darauf achten, dass es als ausführbar markiert ist):
zSwap muss in "/etc/default/grub" deaktiviert werden (+ "update-grub"), weil das (bekloppterweise) auch das komprimierte zRAM komprimiert im RAM cacht(!):
Außerdem setze ich dort die Swappiness auf 100, weil das für eine zRAM-Swap vorteilhaft ist.
Nach dem Reboot kann man das mit "zramctl" kontrollieren:
zRAM-Disk (als normaler Nutzer):
Um zRAM auch als komprimierende RAM-Disk nutzen zu können, habe ich mir zwei Skripte geschrieben (als ausführbar markieren und im Pfad speichern):
"mkzram":
"rmzram":
Mit z. B. "mkzram 12" erstellt man eine 12 GiB große und lz4-komprimierende RAM-Disk und mit "mkzram 12 zstd" das gleiche, nur eben zstd-komprimiert. - Übrigens "darf" die zRAM-Disk auch größer als das RAM sein (also auch 1 TB ist möglich): Es zählt ausschließlich, wie viel tatsächlich belegt und wie groß es komprimiert ist.
Mit "zramctl" kann man sich das Device anzeigen lassen, wie viel Speicher belegt ist und wie gut er komprimiert ist.
Mit z. B. "rmzram 1" löscht man "/dev/zram1".
Tipp:
Mit "sync;sudo fstrim -va" gibt man in der zRAM-Disk gelöschten Speicher wieder frei. - Durch online-discard sollte das eigentlich automatisch geschehen, aber das funktioniert nicht immer/sofort.
Wichtig:
Nach einem Reboot ist eine (z)RAM-Disk (einschließlich Inhalt) natürlich weg.
Ob die beim Ruhezustand erhalten bleibt, kann ich nicht testen, da mein Board eine Macke hat, die S2R/S2D verhindert: ein altes MSI mit AM3: Ich habe noch einen FX8350, da mir der für alles locker reicht.
Das nicht mehr nutzen (s. o.):
zSwap aktiviert man per Grub (in "/etc/default/grub" ändern, dann "update-grub" + Reboot):
Testen ob es übernommen wurde, kann man es mit "head /sys/module/zswap/parameters/*":
Einige Distributionen nehmen "zstd" dort noch nicht an.
Dann in "/etc/default/grub" ändern (+ "update-grub"):
Und es stattdessen per "/etc/rc.local" setzen (darauf achten, dass es als ausführbar markiert ist):
Nach dem Reboot wieder mit "head /sys/module/zswap/parameters/*" kontrollieren. - Falls rc.local bei euch nicht genutzt wird, kenne ich keine weitere Alternative.
Inzwischen (27.10.2022) rate ich von zSwap ab!
Alles was ich bisher dazu geschrieben habe ist damit gegenstandslos.
Nach meinen Erfahrungen (s. u.) ist das eine nutzlos Verschwendung von Arbeitsspeicher, weil dadurch früher ausgelagert werden muss und die Schreiblast sogar steigt: zSwap funktioniert offenbar nur als Lese-Cache, während ausgelagerte Seiten gleich in die Swap geschrieben werden. - Dass die Swap nicht genutzt wird, wenn zSwap ausreichend groß ist, wie man oft dazu liest, ist falsch.
Ich habe das unter Artix (Arch-Derivat) mit Kernel 5.16 und 6.0 getestet.
Da es lt. Arch-Wiki (hier und hier) standardmäßig aktiviert ist, muss es (als Root) in "/etc/default/grub" deaktiviert werden (+ "update-grub"):
Code:
GRUB_CMDLINE_LINUX_DEFAULT="quiet zswap.enabled=0"
Das sollte man immer machen, auch wenn die genutzte Distribution es (noch?) nicht standardmäßig aktiviert: Das kann ja noch kommen.
Nochmal: Egal ob normale Swap-Datei/-Partition, oder zRAM: zSwap muss deaktiviert sein.
Dass es die Speicherseiten zwar im RAM komprimiert speichert, es dann aber wieder unkomprimiert auf Platte schreibt, war mir schon immer suspekt, weshalb ich mich nicht früher damit beschäftigt habe.
zRAM nutze ich dagegen schon seit dem ich 2014 bei meinem gerooteten Huawei Y300 (512 MiB RAM, Android 4.4: CyanogenMod) erstmals darauf gestoßen bin.
Auf dem PC nutze ich Linux seit 2015, da mir Windows XP (x64) nicht mehr tragbar erschien: zuerst LinuxMint bis 2020 (18.3), dann Artix.
Grundlagen:
Es können diese Kompressionen genutzt werden: lzo lzo-rle lz4 lz4hc 842 zstd
Sinnvoll sind aber nur lz4 und zstd:
lzo komprimiert so schnell und schlecht wie lz4, dekomprimiert aber so weniger schnell wie zstd (lahm entpackt zstd ja auch nicht, komprimiert aber viel besser) und das "-rle" ändert daran auch nichts relevantes. Dto. lz4hc (=high compression): Bringt fast nichts, ist nur deutlich langsamer. 842 ist vollkommener Blödsinn.
Bei einer Swap (egal ob zSwap oder zRAM) nutze ich zstd, da das auslagern ja im Hintergrund passiert: Die Geschwindigkeit ist also unwichtiger, als eine gute Kompression. - Wichtig ist dabei auch, dass die Daten im Arbeitsspeicher unkomprimiert vorliegen, also besonders gut gepackt werden können. (z. B. ein JPG muss ja dekodiert werden, um es anzuzeigen: Im RAM ist es quasi ein unkomprimiertes BMP)
Anders bei einer zRAM-Disk: Dorthin kopiert man die gleichen Daten wie auf der Platte, also JPG als JPG, usw. - Da würde eine hohe Kompression oft nicht greifen und zstd würde nutzlos bremsen. Deshalb nutze ich dort vorzugsweise lz4.
zstd komprimiert normalerweise etwas besser als 1:3, während lz4 kaum 1:2 schafft.
Deshalb nutze ich für zSwap 25% des RAMs, was sich mit 4 GiB RAM am einfachsten veranschaulichen lässt:
Von den 4 GiB RAM wird 1 GiB für zSwap reserviert, worin sich mit zstd das dreifache speichern lässt: Also praktisch 3 GiB RAM + 3 GiB zSwap: Aus 4 GiB werden sozusagen 6 GiB.
Dto. bei zRAM, nur dass es andersherum rechnet: Das lege ich mit 75% der RAM-Größe an, was dann aber durch zstd nur 1/3 davon belegt: Bei 4 GiB RAM wird zRAM also 3 GiB groß, belegt (wenn voll) durch die Komprimierung aber nur 1 GiB, so dass man wieder auf 3 GiB + 3 GiB. kommt.
WICHTIG:
zRAM sollte ausschließlich ohne Swap-Partition/-Datei genutzt werden:
Das Problem daran ist: Wenn der Speicher voll wird, zuerst das unwichtigste ausgelagert wird und das zRAM füllt. Wenn dann auch noch Teile der aktuell genutzten Daten ausgelagert werden müssen, ist das zRAM schon voll und sie kommen in die Swap: Also gerade die Daten, auf die ggfs. schnell wieder zugegriffen werden müssen, sind auf der lahmen Platte, weil die alten/unwichtigen Daten das zRAM blockieren.
Wenn man eine physikalische Swap braucht (z. B. für den Ruhezustand), bleibt nur zSwap (das funktioniert ausschließlich mit Swap): Da es als Cache für die Swap arbeitet, sind die aktuellen Daten immer dort, während die älteren Daten, wenn es knapp wird, in die Swap durchgereicht werden (bekloppterweise aber wieder unkomprimiert), so dass obiges Problem nicht entsteht.
Hier noch ein paar Links:
https://www.kernel.org/doc/Documentation/admin-guide/blockdev/zram.rst
https://www.kernel.org/doc/Documentation/admin-guide/mm/zswap.rst
https://www.kernel.org/doc/Documentation/vm/z3fold.rst
Anwendung (als Root):
zRAM-Swap nutze ich per "/etc/rc.local" (darauf achten, dass es als ausführbar markiert ist):
Code:
zSwap muss in "/etc/default/grub" deaktiviert werden (+ "update-grub"), weil das (bekloppterweise) auch das komprimierte zRAM komprimiert im RAM cacht(!):
Code:
GRUB_CMDLINE_LINUX_DEFAULT="quiet sysctl.vm.swappiness=100 zswap.enabled=0"
Nach dem Reboot kann man das mit "zramctl" kontrollieren:
Code:
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd 23,5G 4K 63B 4K 8 [SWAP]
zRAM-Disk (als normaler Nutzer):
Um zRAM auch als komprimierende RAM-Disk nutzen zu können, habe ich mir zwei Skripte geschrieben (als ausführbar markieren und im Pfad speichern):
"mkzram":
Code:
#!/bin/bash
if [ $# == 0 ];then echo "mkzram [Größe in G] [zstd] (sonst lz4)";exit;fi
al=lz4
if [ $2 == "zstd" ] 2>/dev/null;then al=zstd;fi
if [ ! -e /dev/zram* ] 2>/dev/null
then sudo modprobe zram;id=0
else id=$(sudo cat /sys/class/zram-control/hot_add)
fi
echo $al|sudo tee /sys/block/zram$id/comp_algorithm >/dev/null
echo $1"G"|sudo tee /sys/block/zram$id/disksize >/dev/null
sudo mkfs.xfs -q /dev/zram$id && mkdir /tmp/zram$id
sudo mount -o discard /dev/zram$id /tmp/zram$id/ && sudo chmod 777 /tmp/zram$id/
zramctl
"rmzram":
Code:
#!/bin/bash
if [ $# == 0 ];then echo "rmzram [ID]:";zramctl;exit;fi
sudo umount -l /tmp/zram$1/ && rm -rf /tmp/zram$1
echo $1|sudo tee /sys/class/zram-control/hot_remove > /dev/null
if [ ! -e /dev/zram* ] 2>/dev/null;then sudo modprobe -r zram;fi
zramctl
Mit z. B. "mkzram 12" erstellt man eine 12 GiB große und lz4-komprimierende RAM-Disk und mit "mkzram 12 zstd" das gleiche, nur eben zstd-komprimiert. - Übrigens "darf" die zRAM-Disk auch größer als das RAM sein (also auch 1 TB ist möglich): Es zählt ausschließlich, wie viel tatsächlich belegt und wie groß es komprimiert ist.
Mit "zramctl" kann man sich das Device anzeigen lassen, wie viel Speicher belegt ist und wie gut er komprimiert ist.
Mit z. B. "rmzram 1" löscht man "/dev/zram1".
Tipp:
Mit "sync;sudo fstrim -va" gibt man in der zRAM-Disk gelöschten Speicher wieder frei. - Durch online-discard sollte das eigentlich automatisch geschehen, aber das funktioniert nicht immer/sofort.
Wichtig:
Nach einem Reboot ist eine (z)RAM-Disk (einschließlich Inhalt) natürlich weg.
Ob die beim Ruhezustand erhalten bleibt, kann ich nicht testen, da mein Board eine Macke hat, die S2R/S2D verhindert: ein altes MSI mit AM3: Ich habe noch einen FX8350, da mir der für alles locker reicht.
Das nicht mehr nutzen (s. o.):
zSwap aktiviert man per Grub (in "/etc/default/grub" ändern, dann "update-grub" + Reboot):
Code:
GRUB_CMDLINE_LINUX_DEFAULT="quiet zswap.enabled=1 zswap.compressor=zstd zswap.max_pool_percent=25"
Testen ob es übernommen wurde, kann man es mit "head /sys/module/zswap/parameters/*":
Code:
==> /sys/module/zswap/parameters/accept_threshold_percent <==
90
==> /sys/module/zswap/parameters/compressor <==
zstd
==> /sys/module/zswap/parameters/enabled <==
Y
==> /sys/module/zswap/parameters/max_pool_percent <==
25
==> /sys/module/zswap/parameters/non_same_filled_pages_enabled <==
Y
==> /sys/module/zswap/parameters/same_filled_pages_enabled <==
Y
==> /sys/module/zswap/parameters/zpool <==
z3fold
Dann in "/etc/default/grub" ändern (+ "update-grub"):
Code:
GRUB_CMDLINE_LINUX_DEFAULT="quiet zswap.enabled=0"
Und es stattdessen per "/etc/rc.local" setzen (darauf achten, dass es als ausführbar markiert ist):
Code:
#!/bin/sh
#echo 100 > /proc/sys/vm/swappiness
echo zstd > /sys/module/zswap/parameters/compressor
echo 25 > /sys/module/zswap/parameters/max_pool_percent
echo Y > /sys/module/zswap/parameters/enabled
Zuletzt bearbeitet:
(rc.local aktualisiert (2/3 bzw. 3/4 Rechnung entfernt) und zSwap ans Ende gesetzt.))