Mit zRAM, zSwap und zCache den Speicherbedarf reduzieren

Aus LinuxUser 07/2018

Mit zRAM, zSwap und zCache den Speicherbedarf reduzieren

© Sergiy Bobok, 123RF

Sauber entlüftet

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.

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.

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 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 <code>swapon -s</code> sehen Sie, welche Swap-Partitionen ins System eingebunden sind.

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&ouml;glicht das Paket <span class="ui-element">zram-config</span>, automatisch zus&auml;tzlichen Swap-Speicher bereitzustellen.

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&ouml;glichkeit, &uuml;ber zSwap Daten im Kernel zuerst zu komprimieren, statt diese direkt auf ein Swap-Ger&auml;t auszulagern.

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.
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 07/2018 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben