Arbeitsspeicher unter Linux komprimieren

Auf Linux-Systemen mit wenig Arbeitsspeicher kann durch Komprimierung zusätzlich Platz geschaffen werden.

Ist der Arbeitsspeicher bei Linux-Systemen aufgebraucht, wird versucht momentan nicht benötigte Daten auf die vergleichsweise langsame Festplatte oder Speicherkarte auszulagern. Die Auslagerung bremst das System aus und ist zum Beispiel bei Systemen mit Flash-Speicher unerwünscht, da dieser Speicher durch die häufigen Schreiboperationen schneller altert. Durch die Komprimierung des Arbeitsspeichers kann erreicht werden, dass die Auslagerung weiter hinausgezögert bzw. sogar komplett vermieden werden kann. Eine Möglichkeit für das Anlegen von komprimierten Block-Geräten im Arbeitsspeicher ist zRAM, welches im weiteren Verlauf des Artikels genauer beschrieben wird.

Das zRAM Modul befindet sich bereits seit geraumer Zeit im Linux Kernel, hat es jedoch erst mit Version 3.14 in den offiziellen Zweig geschafft. Zum Einsatz kommt diese Technik bereits bei Chrome OS und teilweise auch bei Android. Auch Linux Distributionen, die sich speziell an Systeme mit wenige Arbeitsspeicher richten, haben zRAM aktiviert. Ein Vertreter ist Lubuntu ab Version 13.10. Ein Nachteil dieser Technik ist jedoch, dass die Komprimierung zusätzliche Ressourcen des Prozessors beansprucht.

Im folgenden Beispiel ist die Auslastung des Arbeitsspeichers bei einem System mit ca. 1GB Arbeitsspeicher und ca. 2GB Swap Speicher vor dem Einsatz von zRAM zu sehen. Erkennbar ist, dass das System bereits begonnen hat erste Daten auf die Festplatte auszulagern.

$ free -m
            total       used       free     shared    buffers     cached
Mem:          1005        901        103         10         38        187
-/+ buffers/cache:        675        329
Swap:         2047         23       2024

$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/dev/dm-4                               partition   2097148 24036   -1

Damit der Arbeitsspeicher komprimiert werden kann, müssen weitere Schritte durchgeführt werden. Das folgende Beispiel zeigt ein Bash-Skript, welches die minimalen Befehle enthält und als root-Nutzer ausgeführt werden muss.

#!/bin/bash
modprobe zram num_devices=2

echo $((512*1024*1024)) > /sys/block/zram0/disksize
echo $((512*1024*1024)) > /sys/block/zram1/disksize

mkswap /dev/zram0
mkswap /dev/zram1

swapon -p 10 /dev/zram0
swapon -p 10 /dev/zram1

In dem vorgestellten Bash-Skript wird zunächst das entsprechende Modul mit der Unterstützung von zwei komprimierten Block-Geräten geladen. Anschließend werden die Beiden neuen Block-Geräte mit einer Größe von je 512MByte angelegt. Danach werden zwei neue Swap Medien im komprimierten Arbeitsspeicher erzeugt. Zum Abschluss werden beide Swap-Bereiche mit einer Priorität von 10 aktiviert. Die Angabe der Priorität bewirkt, dass der komprimierte Arbeitsspeicher gegenüber der Festplatte bevorzugt wird.

Hinweis: CPUs/Kerne
Die Anzahl der Block-Geräte sollte sich an der Zahl der CPUs/Kerne orientieren. So ist eine gute Verteilung der benötigten Ressourzen auf alle CPUs/Kerne möglich.

Hinweis: Die Größe der komprimierten Block-Geräte orientiert sich am vorhanden Arbeitsspeicher und sollte diesen nicht übersteigen.

Nachdem das weiter oben vorgestellte Skript bzw. die darin enthaltenen Befehle als root-Benutzer ausgeführt wurden, sieht die Speicherauslastung wie folgt aus.

$ free -m
            total       used       free     shared    buffers     cached
Mem:          1005        896        108         10         42        177
-/+ buffers/cache:        677        327
Swap:         3071         46       3025

$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/dev/dm-4                               partition   2097148 24092   -1
/dev/zram0                              partition   524284  11952   10
/dev/zram1                              partition   524284  11964   10

Zu sehen ist, dass zwei weitere Swap-Geräte vorhanden sind und der Swap-Speicher insgesamt um 1GB größer ist.

Verwandte Artikel