Datenkompression kostet heute kaum noch Rechenleistung. Da lohnt es sich in einigen FĂ€llen, bei RAM und Cache die Luft rauszulassen.
Der Arbeitsspeicher (RAM) dient zum Speichern von Daten fĂŒr den laufenden Betrieb. Er gewĂ€hrleistet, dass alle erforderlichen Daten so schnell wie möglich bereitstehen. Da die Daten beim Abschalten nicht erhalten bleiben, heiĂt er flĂŒchtiger Speicher. Von der GröĂe des Arbeitsspeichers hĂ€ngt unter anderem ab, wie viele Programme gleichzeitig ohne EinbuĂen laufen oder wie schnell der Rechner Daten verarbeitet.
RAM hat eine ultrakurze Zugriffszeit, kommt aber in der Anschaffung vergleichsweise teuer. Zudem lĂ€sst es sich nicht endlos aufzustocken, weil das Board nur eine maximale GröĂe akzeptiert und nur eine feste Anzahl von Slots dafĂŒr bietet. Speichermodule fĂŒr Ă€ltere GerĂ€te sind obendrein mitunter schwer zu beschaffen.
Andererseits bieten aktuelle GerĂ€te eine Rechenleistung, bei der eine Kompression von Daten im laufenden Betrieb kaum noch ins Gewicht fĂ€llt. Was als Technik bislang weitgehend beim Archivieren von Daten auf der Festplatte zum Einsatz kam, eignet sich jedoch auch fĂŒr den Datentransfer via Netzwerk und den Einsatz im Speicher. Das Protokoll HTTP/2 [1] fĂŒr das Ausliefern von Daten ĂŒber das Web benutzt bereits Kompression, um die Menge der zu ĂŒbertragenden Daten zu verringern [2].
Mit den drei Methoden zRAM, zSwap und zCache stehen drei Implementationen bereit, die das Komprimieren von Inhalten auf den Arbeitsspeicher ausweiten. Seit Kernel 3.14 finden sich diese Features in der Hauptlinie des Kernels [3], fristen aber im Alltag oft ein Schattendasein. Lediglich Android 4.4 sowie Knoppix ab Version 7 aktivieren zRAM bereits standardmĂ€Ăig.
Bestandsaufnahme
Bevor es an den Einsatz der Kompressionstechnologien geht, sollten Sie wissen, wie viel Speicher ĂŒberhaupt im System verbaut ist. Dazu mĂŒssen Sie nicht erst den Rechner aufschrauben und nachsehen â es gibt Software, die das zuverlĂ€ssig ermittelt und anzeigt. Auf der Kommandozeile erledigt das Dmidecode [4], in einer grafischen Umgebung greifen Sie zu Hardinfo und Lshw-gtk.
Dmidecode ermittelt auf der Grundlage des Desktop Management Interfaces (DMI) [5] die Informationen zu den verbauten Systemkomponenten wie der CPU, dem Motherboard und dem Speicher. Um lediglich die Informationen zum Speicher zu erhalten, rufen Sie das Programm mit dem Parameter --type memory auf; Listing 1 zeigt eine entsprechende Ausgabe.
Listing 1
$ sudo dmidecode --type memory
# dmidecode 2.12
SMBIOS 2.7 present.
Handle 0x0007, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 16 GB
Error Information Handle: Not Provided
Number Of Devices: 1
Handle 0x0008, DMI type 17, 34 bytes
Memory Device
Array Handle: 0x0007
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 8192 MB
Form Factor: SODIMM
Set: None
Locator: ChannelA-DIMM0
Bank Locator: BANK 0
Type: DDR3
Type Detail: Synchronous
Speed: 1600 MHz
Manufacturer: Samsung
Serial Number: 25252105
Asset Tag: None
Part Number: M471B1G73DB0-YK0
Rank: Unknown
Configured Clock Speed: 1600 MHz
Die Ausgabe stammt von einem Computer, der mit einem einzigen Baustein mit einer GröĂe von 8 GByte DDR3-RAM ausgestattet ist. Das Modul lĂ€uft mit einem Takt von 1600 MHz. Die Ăbersicht zeigt, dass die maximale KapazitĂ€t auf dem Board 16 GByte betrĂ€gt â ein weiteres Modul mit 8 GByte wĂ€re somit noch möglich.
Abbildung 1 zeigt die Ausgabe des Programms Hardware Lister (lshw-gtk). Die Daten stammen aus einer virtuellen Maschine mit Debian 9, die lediglich ĂŒber knapp 2 GByte RAM verfĂŒgt.

Abbildung 1: Der Hardware Lister gibt Auskunft ĂŒber die Komponenten in einem PC, darunter die Spezifika des Hauptspeichers.
Um herauszubekommen, wie viel RAM das laufende System gerade nutzt, stehen unter anderem die beiden Programme Free und Htop bereit. Abbildung 2 zeigt Free im Einsatz. Der Aufruf erfolgte mit dem Parameter -h (Langform --human), der dafĂŒr sorgt, dass die Ausgabe fĂŒr Menschen leichter zu lesen ist. Im vorliegenden Fall sind insgesamt 2 GByte RAM vorhanden, davon nutzen die laufenden Prozesse 356 MByte.

Abbildung 2: Mit dem Konsolenwerkzeug Free ermitteln Sie, ĂŒber viel RAM ein System verfĂŒgt und wie viel davon laufende Prozesse beanspruchen.
RAM stellt ein wertvolles Gut dar. Je voller der Arbeitsspeicher ist, umso mehr Aufwand verursacht es, die entsprechende Anzahl Memory Pages fĂŒr die einzelnen Anwendungen bereitzustellen. LĂ€nger nicht genutzte Memory Pages lagert der Kernel in den Swapspace aus (siehe Kasten “Swap”), der sich meist auf einem (langsameren) Massenspeicher befindet. Genau hier setzen wir an.
Bei zRAM, zSwap und zCache handelt es sich um drei verschiedene Verfahren, die es Ihnen ermöglichen, die verfĂŒgbaren Speicherzellen effektiver zu nutzen. zRAM (frĂŒher Compcache [6] genannt) erzeugt eine komprimierte Partition als Block Device im RAM, die sich als virtueller Swapspace oder als RAM-Disk nutzen lĂ€sst. Bei zSwap [7] handelt es sich um einen komprimierten Puffer, der sich als Write-Back-Cache fĂŒr physikalischen Swapspace nutzen lĂ€sst. Dadurch verzögert oder vermeidet er Zugriffe auf den Massenspeicher, was die I/O-Last reduziert. zCache dient als Backend fĂŒr einen speziellen, virtuellen RAM-Typ, der sich nutzen lĂ€sst, um Dateisysteminhalte oder Swap-Daten zu puffern.
Swap
Der Begriff Swap steht fĂŒr das externe Speichern beziehungsweise Auslagern von Inhalten des Arbeitsspeichers. Swap [12] funktioniert nur in Verbindung mit einer Swap-Partition oder einem Swap-GerĂ€t [13]. Sobald der Arbeitsspeicher volllĂ€uft, lagert das System jene Speicherseiten aus, auf die am lĂ€ngsten nicht mehr zugegriffen wurde (LRU, “least recently used”). Dabei geht es von der Annahme aus, diese Daten nicht so schnell wieder zu benötigen. Das Auslagern der Daten in den Swapspace erfolgt unkomprimiert. Erfolgt dann doch ein Zugriff auf diese Daten, dauert das deutlich lĂ€nger, da das System sie erst von der Swap-Partition wieder laden muss, statt direkt auf den Arbeitsspeicher zugreifen zu können. Arbeitet das System jedoch ohne Swap und der Arbeitsspeicher lĂ€uft voll, dann beendet der Kernel nach eigenem Ermessen Programme, um so wieder RAM freizumachen. Das hat in der Regel einen ungewollten Datenverlust zur Folge.
Im Detail
Mit zRAM [8] verlagern Sie Daten komprimiert direkt im RAM. Stehen keine weiteren Speicherseiten (Memory Pages) mehr bereit, versucht der Kernel, die Daten auf diesem Block Device vorzuhalten. Durch dieses Vorgehen verdoppelt beziehungsweise verdreifacht sich die entsprechende SpeicherkapazitÀt [9].
Derzeit steht fĂŒr Debian noch kein Paket bereit, sodass Sie ein solches virtuelles Swap-Device manuell einrichten mĂŒssen (Listing 2). Dazu laden Sie zunĂ€chst einmal das Kernel-Modul zram nach (Zeile 1). Dabei sorgt die Angabe num_devices=2 dafĂŒr, dass es die beiden GerĂ€te /dev/zram0 und /dev/zram1 anlegt. Ersteres dient im nachfolgenden Beispiel als zusĂ€tzliche Swap-Partition, das zweite einfach als ein komprimiertes Verzeichnis im RAM.
Listing 2
$ sudo modprobe zram num_devices=2 $ sudo zramctl --find --size 512M /dev/zram0 $ sudo mkswap /dev/zram0 Setting up swapspace version 1, size = 512 MiB (536866816 bytes) no label, UUID=009222e1-d138-41aa-8656-64a2c3655004 $ sudo swapon /dev/zram0 $ sudo swapoff /dev/zram0 $ sudo zramctl --reset /dev/zram0
Zeile 2 zeigt, wie Sie nun das nĂ€chste verfĂŒgbare zRAM-GerĂ€t suchen und ihm eine GröĂe von 512 MByte zuweisen. Zum Einsatz kommt hierbei das Kommando zramctl aus dem Paket util-linux. Mit dem Kommando mkswap legen Sie das GerĂ€t als Swap-Partition an (Zeile 4), was ihm unter anderem eine eindeutige Kennung in Form einer UUID zuweist (Zeile 6). Ăber den Aufruf swapon /dev/zram0 binden Sie das Device schlieĂlich als zusĂ€tzlichen Auslagerungsspeicher ein (Zeile 7).
Zur Integration von /dev/zram1 als komprimiertes Verzeichnis im Arbeitsspeicher gehen Sie Ă€hnlich vor [10]. Erst bestimmen Sie das nĂ€chste GerĂ€t mittels zramctl und legen danach ein Dateisystem darauf an. Hier genĂŒgt als Typ Ext2 vollkommen, da Sie im Arbeitsspeicher kein Journaling benötigen. AnschlieĂend binden Sie das neue Device an einen Mountpunkt an. Abbildung 3 zeigt das Vorgehen und insbesondere die Ausgabe von Zramctl. Die Spalten in der Ausgabe umfassen den Namen der GerĂ€te, den verwendeten Kompressionsalgorithmus (lzo), den Speicherplatz auf dem GerĂ€t, die Daten (unkomprimiert, komprimiert und gesamt), die Anzahl der Kompressionsströme sowie den jeweiligen Mountpunkt.

Abbildung 3: Mit nur wenigen Kommandos erzeugen Sie ein zRAM-GerĂ€t, das Sie anschlieĂend formatieren und in einem beliebigen Verzeichnis einhĂ€ngen.
Abbildung 4 zeigt den Aufruf von swapon -s. Der Schalter -s kĂŒrzt die Option --summary ab und zeigt eine Ăbersicht ĂŒber alle derzeit ins System eingebundenen Swap-Partitionen an â in vorliegendem Fall /dev/sda3 und /dev/zram0. Die Ausgabe umfasst fĂŒnf Spalten: den Namen der Datei beziehungsweise des GerĂ€ts, den Typ, die GröĂe, die Bytes in Benutzung sowie die PrioritĂ€t. Je gröĂer die PrioritĂ€t, umso wichtiger ist die Partition beim Auslagern.

Abbildung 4: Mit dem Befehl swapon -s sehen Sie, welche Swap-Partitionen ins System eingebunden sind.
Um die Swap-Partition /dev/zram0 spÀter wieder zu entfernen und im Speicher aufzurÀumen, verwenden Sie die Kommandos aus den letzten beiden Zeilen von Listing 2.
FĂŒr Ubuntu existiert schon lĂ€nger ein Paket namens zram-config. Nach dessen Installation ĂŒber die Paketverwaltung richten Sie das zRAM-GerĂ€t im laufenden Betrieb ein. Dazu starten Sie den Dienst zram-config mittels systemctrl (Listing 3, erste Zeile).
Listing 3
$ sudo systemctrl start zram-config $ sudo systemctrl stop zram-config
Danach steht das neue GerĂ€t /dev/zram0 sofort als zusĂ€tzliche Swap-Partition bereit. Mithilfe des Kommandos swapon -s zeigt das System dies an (Abbildung 5). Die Software ordnet dem Swap-Device automatisch die HĂ€lfte des physischen Arbeitsspeichers zu. Derzeit lĂ€sst sich weder ĂŒber den Aufruf des Diensts noch eine Konfiguration ein anderer Wert festlegen. Möchten Sie das Swap-GerĂ€t im RAM wieder entfernen, genĂŒgt der Aufruf aus der letzten Zeile von Listing 3.

Abbildung 5: Unter Ubuntu ermöglicht das Paket zram-config, automatisch zusÀtzlichen Swap-Speicher bereitzustellen.
Aus Swap wird zSwap
Sorgt ein zusĂ€tzlicher Swap-Speicher auf einem zRAM-GerĂ€t dafĂŒr, dass mehr Platz zum Auslagern bereitsteht, so verfolgt zSwap einen anderen Ansatz: Dahinter verbirgt sich eine Funktion des Kernels, die einen komprimierten Zwischenspeicher erzeugt. NĂŒtzlich ist dies fĂŒr alle Installationen, bei denen es bereits einen Swap-Bereich gibt.
Anstatt Speicherseiten auf ein entsprechendes GerĂ€t zu verschieben, komprimiert zSwap zuerst die entsprechenden Daten. Danach legt es diese in einem dynamisch zugewiesenen Speicher-Pool ab. Der Vorteil: Das System schiebt damit das ZurĂŒckschreiben auf das Swap-GerĂ€t auf oder vermeidet es sogar vollstĂ€ndig. Das Schreiben und Lesen im Cache erfolgt deutlich schneller als von einem Swap-GerĂ€t auf einem DatentrĂ€ger.
Bei einem aktuellen Kernel ist diese Funktion als Modul enthalten und aktiviert. Abbildung 6 zeigt das fĂŒr einen Debian-Kernel der Version 4.9.x. Gegebenenfalls genĂŒgt die Angabe zswap.enabled=1 in der Konfiguration von Grub, um das Feature zu aktivieren.
Abbildung 6: Sie haben die Möglichkeit, ĂŒber zSwap Daten im Kernel zuerst zu komprimieren, statt diese direkt auf ein Swap-GerĂ€t auszulagern.
zCache
Zu guter Letzt folgt der Dritte im Bunde: zCache [11]. Dabei handelt es sich um ein Backend fĂŒr einen speziellen Typ von virtuellem RAM, sogenanntes Transcendent Memory. Es kommt beim komprimierten Zwischenspeichern von Dateien beziehungsweise zum Auslagern solcher Files zum Einsatz. Bei zSwap handelt es sich um eine vereinfachte Variante von zCache. Das Modul zCache gilt allerdings derzeit noch als experimentell. Sie aktivieren diese Eigenschaft des Kernels, indem Sie in der Konfiguration von Grub den Parameter zcache ergĂ€nzen und das System neu starten.
Fazit
Alle drei vorgestellten Methoden haben das Ziel, den Zugriff auf langsamere DatentrĂ€ger zu vermeiden. Das erreichen die drei Techniken mit spĂŒrbarem Erfolg; in Tests bezĂŒglich der Laufzeit traten keine BeeintrĂ€chtigungen auf. WĂ€hrend zRAM ein eigenes Block Device anlegt, kommen zSwap und zCache ohne ein solches aus und sind bereits im Linux-Kernel als Module integriert. Nach unseren Beobachtungen arbeiten alle drei Methoden mit dem Kompressionsalgorithmus Lempel-Ziv-Oberhumer (LZO), erlauben aber prinzipiell auch alternative Verfahren. Die effektivere Nutzung des Speichers macht insbesondere bei kleineren GerĂ€ten unter UmstĂ€nden einen deutlichen Effekt aus.
Danksagung
Die Autoren bedanken sich bei Gerold Rupprecht und Axel Beckert fĂŒr deren Anregungen und Kritik im Vorfeld des Artikels.
Die Autoren
Frank Hofmann arbeitet von Berlin, Genf und Kapstadt aus als Entwickler, Trainer und Autor. Er ist zudem Koautor des Debian-Paketmanagement-Buchs (http://www.dpmb.org). Mandy Neumeyer arbeitet im Tourismus, lebt seit neun Jahren in SĂŒdafrika und baut zurzeit ein zusĂ€tzliches Einkommen als digitaler Nomade auf.
Glossar
- Memory Pages
- Speichereinheiten, die der Kernel fĂŒr die Prozesse bereitstellt.
Infos
- HTTP/2: https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP/2
- Webseiten-Ladezeiten verringern: Gerold Rupprecht, Frank Hofmann, “Beschleunigt”, LUÂ 06/2015, https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2015/06/Beschleunigt
- zRAM: https://en.wikipedia.org/wiki/Zram
- “How to Get Hardware Information with Dmidecode Command on Linux”: https://www.tecmint.com/how-to-get-hardware-information-with-dmidecode-command-on-linux/
- Desktop Management Interface: https://www.dmtf.org/standards/dmi
- Compcache: https://code.google.com/archive/p/compcache/
- zSwap: https://www.kernel.org/doc/Documentation/vm/zswap.txt
- zRAM: https://wiki.gentoo.org/wiki/Zram
- ZRAM-RAM-Kompression: https://wr.informatik.uni-hamburg.de/_media/teaching/wintersemester_2017_2018/ep-1718-warnke-zram-praesentation.pdf
- Zramctl: http://karelzak.blogspot.co.za/2014/08/zramctl.html
- “How do I use/enable zcache?”: https://askubuntu.com/questions/300685/how-do-i-use-enable-zcache
- “Linux Kernel Memory Management: Swap Space”: https://linuxhint.com/linux-memory-management-swap-space/
- “Optimizing Linux Memory Usage”: https://linuxhint.com/optimizing-linux-memory-usage/





