# Linux - ZRAM Config

**Ziel:** ZRAM als schnellen Swap einrichten (komprimierter RAM statt SSD/HDD), passende Größe für 2 GB bis 128 GB RAM wählen, Prioritäten korrekt setzen, Latenz/CPU-Last sauber austarieren, Verifikation &amp; Monitoring verstehen.

**Voraussetzung:** Die Installations-/Systemänderungsbefehle erfordern Root-Rechte (z. B. via Root-Shell). Reine Anzeige-/Monitoring-Befehle funktionieren auch als normaler Nutzer.

---

## Inhalt

1. [Grundidee: Was ist ZRAM und wofür nutzt man es?](#bkmrk-grundidee-zram)
2. [Quick-Check: Ist ZRAM aktiv und sinnvoll priorisiert?](#bkmrk-quickcheck-zram)
3. [Sizing: Empfehlungen von 2 GB bis 128 GB RAM](#bkmrk-sizing-zram)
4. [Kompressions-Algorithmen: `lz4` vs. `zstd` (und warum)](#bkmrk-algorithmen-zram)
5. [Installation (Debian/Ubuntu)](#bkmrk-installation-zram)
6. [Konfiguration: systemd-zram-generator (empfohlen)](#bkmrk-konfig-systemd-zram)
7. [Konfiguration: zram-tools (Alternative)](#bkmrk-konfig-zram-tools)
8. [VM-/Kernel-Tuning: warum diese sysctl-Werte?](#bkmrk-vm-tuning-zram)
9. [Disk-Swap: wann, warum, Priorität](#bkmrk-disk-swap-zram)
10. [Verifizieren &amp; Monitoring (inkl. PSI)](#bkmrk-verifizieren-zram)
11. [Rollback: wie man es sauber rückgängig macht](#bkmrk-rollback-zram)

---

## Grundidee: Was ist ZRAM und wofür nutzt man es?

- **ZRAM** erstellt ein Blockdevice im RAM (z. B. `/dev/zram0`), das **komprimiert** wird und als **Swap** dienen kann.
- **Warum?** Wenn RAM knapp wird, landen selten genutzte Speicherseiten im Swap. Mit ZRAM passiert das im RAM (schnell), statt auf SSD/HDD (langsam, verschleißfördernd).
- **Trade-off:** Kompression braucht CPU. Je nach Workload ist *weniger* CPU-Last wichtiger als maximale Kompression.

*Merke:* ZRAM ist ein Puffer gegen Speicherpeaks und OOM, kein Ersatz für realistischen RAM-Bedarf.

---

## Quick-Check: Ist ZRAM aktiv und sinnvoll priorisiert?

<details id="bkmrk-quickcheck-zram-details"><summary>**Kommandos**</summary>

```bash
swapon --show
free -h
zramctl
cat /sys/block/zram0/mm_stat
cat /proc/pressure/memory
```

#### Warum genau diese Befehle?

<dl id="bkmrk-quickcheck-warum-dl"><dt>`swapon --show`</dt><dd>Zeigt aktive Swap-Geräte (ZRAM und ggf. Disk-Swap), inkl. Größe, Nutzung und Priorität. **Wichtigster Punkt:** ZRAM sollte eine **höhere Priorität** haben als Disk-Swap, damit zuerst der schnelle komprimierte RAM genutzt wird.</dd><dt>`free -h`</dt><dd>Gibt eine grobe Übersicht über RAM/Swap. Besonders relevant ist **verfügbar**: das ist die Menge RAM, die ohne massiven Stress freigemacht werden kann (Cache wird dabei mitgedacht). **Unterschied zu swapon:** `free` zeigt Gesamtbild, `swapon` zeigt Swap-Details.</dd><dt>`zramctl`</dt><dd>Zeigt ZRAM-spezifische Infos: Algorithmus, virtuelle Disksize, sowie wieviel **unkomprimierte** Daten im ZRAM liegen und wieviel **realer RAM** dafür belegt wird. **Unterschied zu free:** `free` sieht nur „Swap belegt“, `zramctl` zeigt die Kompressionswirkung.</dd><dt>`cat /sys/block/zram0/mm_stat`</dt><dd>Detail-Statistiken aus dem Kernel: u. a. wieviel Daten im ZRAM liegen und wie effektiv komprimiert wird. Gut, um einzuschätzen, ob z. B. `zstd` wirklich einen Vorteil bringt oder nur CPU verbrennt.</dd><dt>`cat /proc/pressure/memory`</dt><dd>PSI (Pressure Stall Information) zeigt, ob Prozesse messbar auf Speicher warten mussten. **Warum das wichtig ist:** Ruckler, Audio-Aussetzer und „alles zäh“ korrelieren oft eher mit PSI als mit „Swap ist voll“.</dd></dl></details>---

## Sizing: Empfehlungen von 2 GB bis 128 GB RAM

**Regel:** Wenig RAM → aggressiver (mehr ZRAM), viel RAM → moderater (ZRAM als Sicherheitsnetz). Ziel ist weniger OOM und weniger Disk-Swap, nicht „unendlich Tabs durch Kompression“.

<table id="bkmrk-sizing-zram-table" style="width: 100%;"><thead><tr><th>RAM</th><th>ZRAM-Größe (Richtwert)</th><th>Warum gerade so?</th><th>Typische Nutzung</th></tr></thead><tbody><tr><td>**2 GB**</td><td>75–100% (1.5–2 GB)</td><td>Ohne Puffer kommt es schnell zu OOM. ZRAM schafft Luft, ohne Disk-I/O.</td><td>Minimal-Desktop, kleine Server, VMs</td></tr><tr><td>**4 GB**</td><td>75–100% (3–4 GB)</td><td>Hier bringt ZRAM oft den größten „Feeling“-Gewinn: weniger harte Memory-Kanten.</td><td>Browser/Office/kleine Tools</td></tr><tr><td>**8 GB**</td><td>~75% (6 GB)</td><td>Genug, um Peaks abzufedern, ohne zu viel in Swap zu driften.</td><td>Allround-Desktop</td></tr><tr><td>**16 GB**</td><td>60–75% (10–12 GB)</td><td>Guter Sweet Spot: ZRAM ist Reserve, aber RAM bleibt Hauptarbeitsfläche.</td><td>IDE/Browser/leichte VMs</td></tr><tr><td>**32 GB**</td><td>50–75% (16–24 GB)</td><td>Bei Tab/IDE/Meetings hilft mehr ZRAM, Disk-Swap zu vermeiden.</td><td>Heavy Desktop/Workstation</td></tr><tr><td>**64 GB**</td><td>40–50% (24–32 GB)</td><td>Mehr RAM → ZRAM wird seltener gebraucht, sollte aber Peaks fangen.</td><td>Builds, VMs, Containers</td></tr><tr><td>**128 GB**</td><td>25–40% (32–48 GB)</td><td>ZRAM als Sicherheitsnetz. Zu groß kann „Swap-Gewohnheiten“ fördern.</td><td>Große Workstations/Server</td></tr></tbody></table>

*Merke:* ZRAM „Disksize“ ist virtuell. Realer RAM wird erst belegt, wenn Seiten wirklich im ZRAM landen. Trotzdem beeinflusst großer ZRAM die Swap-Strategie des Systems, deshalb bei sehr viel RAM moderater bleiben.

---

## Kompressions-Algorithmen: `lz4` vs. `zstd`

<table id="bkmrk-algo-zram-table" style="width: 100%;"><thead><tr><th>Algorithmus</th><th>Stärke</th><th>Schwäche</th><th>Wann nehmen?</th></tr></thead><tbody><tr><td>**`lz4`**</td><td>Sehr niedrige CPU-Last, geringe Latenz</td><td>Weniger Kompression (mehr RAM-Verbrauch pro Swap-Seite)</td><td>Meetings/Audio/Low-Latency wichtig, schwächere CPU, Desktop „smooth“</td></tr><tr><td>**`zstd`**</td><td>Sehr gute Kompression (mehr „virtueller RAM“)</td><td>Höhere CPU-Last als lz4</td><td>Viele Daten/Tabs/IDE/VMs und CPU ist nicht der Engpass</td></tr></tbody></table>

*Merke:* Wenn PSI/Audio-Ruckler dein Problem sind, ist `lz4` oft die bessere Wahl. Wenn OOM/disk-swap dein Problem sind, bringt `zstd` oft mehr Nutzwert.

---

## Installation (Debian &amp; Ubuntu)

<details id="bkmrk-installation-systemd-zram-generator"><summary>**Option A (empfohlen): systemd-zram-generator**</summary>

```bash
apt update
apt install -y systemd-zram-generator
```

<dl id="bkmrk-installation-a-warum"><dt>`apt update`</dt><dd>Aktualisiert Paketlisten. **Unterschied zu install:** ohne frische Listen kann `apt` alte Versionen/Abhängigkeiten sehen oder Pakete nicht finden.</dd><dt>`apt install -y systemd-zram-generator`</dt><dd>Installiert den Generator, der beim Booten ZRAM-Devices nach Konfig erzeugt. **Warum das bevorzugt ist:** saubere systemd-Integration, klare Konfigdatei, gut wartbar. Das `-y` beantwortet die Rückfrage automatisch (nützlich für Copy/Paste, weniger nützlich für Menschen, die gern überraschende Dinge abbrechen).</dd></dl></details><details id="bkmrk-installation-zram-tools"><summary>**Option B (Alternative): zram-tools**</summary>

```bash
apt update
apt install -y zram-tools
```

<dl id="bkmrk-installation-b-warum"><dt>`apt install -y zram-tools`</dt><dd>Installiert ein klassisches Setup-Skript/Service für ZRAM-Swap. **Unterschied zu Option A:** funktioniert oft okay, aber weniger flexibel und weniger „systemd-nativ“.</dd></dl></details>---

## Konfiguration: systemd-zram-generator (empfohlen)

**Datei:** `/etc/systemd/zram-generator.conf`

<details id="bkmrk-konfig-systemd-zram-snippets"><summary>**Konfig-Snippets nach RAM-Klasse**</summary>

#### 2–4 GB RAM (maximaler Puffer, geringe CPU-Last)

```ini
[zram0]
zram-size = ram * 1.0
compression-algorithm = lz4
swap-priority = 100
```

**Warum:** Bei Low-RAM ist OOM die größte Gefahr. `lz4` hält CPU-Latenz klein, während 100% ZRAM die Überlebenschancen erhöht.

#### 8–16 GB RAM (Allround)

```ini
[zram0]
zram-size = ram * 0.75
compression-algorithm = zstd
swap-priority = 100
```

**Warum:** 75% ist ein guter Kompromiss. `zstd` holt mehr Effekt aus dem ZRAM heraus, weil hier oft viele ähnliche Seiten anfallen (Browser/IDE).

#### 32 GB RAM (Heavy Desktop/Workstation)

```ini
[zram0]
zram-size = ram * 0.60
compression-algorithm = zstd
swap-priority = 100
```

**Warum:** Genug ZRAM als Reserve, aber nicht so viel, dass das System „Swap ist ja da“ als Einladung versteht.

#### 64–128 GB RAM (Sicherheitsnetz, Latenz wichtiger)

```ini
[zram0]
zram-size = ram * 0.35
compression-algorithm = lz4
swap-priority = 100
```

**Warum:** Bei viel RAM sind harte Peaks seltener. Wenn doch, willst du glatte Latenz statt maximale Ratio. Daher moderater Size + `lz4`.

</details><details id="bkmrk-konfig-systemd-zram-apply"><summary>**Konfig anwenden**</summary>

```bash
systemctl daemon-reload
systemctl restart systemd-zram-setup@zram0.service
```

<dl id="bkmrk-systemd-apply-warum"><dt>`systemctl daemon-reload`</dt><dd>Lädt systemd-Konfiguration neu ein. **Warum:** systemd merkt sich Units/Generator-Ergebnisse; ohne Reload kann eine Änderung wirkungslos bleiben. **Unterschied zu restart:** Reload aktualisiert systemd selbst, Restart startet nur den Dienst neu.</dd><dt>`systemctl restart systemd-zram-setup@zram0.service`</dt><dd>Initialisiert/konfiguriert `zram0` neu. **Warum:** Wendet neue ZRAM-Größe/Algorithmus an, ohne Neustart. **Wenn die Unit anders heißt:** `systemctl list-units --type=service --all` nutzen und im Pager nach „zram“ suchen.</dd></dl></details>---

## Konfiguration: zram-tools (Alternative)

**Datei:** `/etc/default/zramswap`

<details id="bkmrk-konfig-zram-tools-examples"><summary>**Beispiele (mit Begründung)**</summary>

```conf
# 2 GB RAM
ALGO=lz4
PERCENT=100
PRIORITY=100

# 8 GB RAM
# ALGO=zstd
# PERCENT=75
# PRIORITY=100

# 32 GB RAM
# ALGO=zstd
# PERCENT=60
# PRIORITY=100

# 128 GB RAM
# ALGO=lz4
# PERCENT=35
# PRIORITY=100
```

<dl id="bkmrk-zram-tools-warum"><dt>`ALGO`</dt><dd>Legt den Kompressionsalgorithmus fest. `lz4` ist latenzfreundlicher, `zstd` komprimiert besser. **Unterschied:** CPU vs. Kompressionsrate (siehe Tabelle oben).</dd><dt>`PERCENT`</dt><dd>Prozentualer Anteil des RAM, der als ZRAM-Disksize verwendet wird. **Warum:** Steuert, wie viel „Reserve“ du hast. **Unterschied zu systemd-zram-generator:** Dort nutzt man meist Formeln (`ram * 0.75`) statt Prozent-Integer.</dd><dt>`PRIORITY`</dt><dd>Swap-Priorität für ZRAM. **Warum:** ZRAM soll vor Disk-Swap drankommen. Priorität ist der zentrale Mechanismus, um die Reihenfolge zu erzwingen.</dd></dl></details><details id="bkmrk-konfig-zram-tools-apply"><summary>**Konfig anwenden**</summary>

```bash
systemctl restart zramswap.service
```

<dl id="bkmrk-zram-tools-apply-warum"><dt>`systemctl restart zramswap.service`</dt><dd>Startet den ZRAM-Swap-Dienst neu, damit `ALGO`/`PERCENT`/`PRIORITY` neu gesetzt werden. Unterschied zu `daemon-reload`: hier wird nur der Service neu gestartet, nicht systemd selbst.</dd></dl></details>---

## VM-/Kernel-Tuning: warum diese sysctl-Werte?

**Datei:** `/etc/sysctl.d/99-zram-tuning.conf`

<details id="bkmrk-vm-tuning-zram-config"><summary>**Empfohlene Werte (Desktop/Allround)**</summary>

```conf
vm.swappiness=100
vm.page-cluster=0
vm.vfs_cache_pressure=50
vm.dirty_background_ratio=5
vm.dirty_ratio=15
```

#### Warum genau diese Werte?

<dl id="bkmrk-vm-tuning-warum-dl"><dt>`vm.swappiness=100`</dt><dd>Erlaubt dem Kernel, eher zu swappen. **Warum sinnvoll mit ZRAM:** Swap ist hier schnell, weil er im RAM liegt. **Unterschied zu klassischem Disk-Swap:** Bei SSD/HDD wäre ein hoher Wert oft fühlbar langsamer.</dd><dt>`vm.page-cluster=0`</dt><dd>Beeinflusst, wie viele Swap-Seiten auf einmal read-ahead geladen werden. **Warum 0:** Bei ZRAM ist Read-ahead oft kein Gewinn und kann Latenzspitzen erzeugen, weil unnötig viel dekomprimiert wird.</dd><dt>`vm.vfs_cache_pressure=50`</dt><dd>Steuert, wie aggressiv der Kernel Dentry/Inode-Caches verwirft. **Warum niedriger:** Desktop-Workloads profitieren davon, wenn Metadaten-Caches länger bleiben (Dateibrowser, IDE, viele kleine Files).</dd><dt>`vm.dirty_background_ratio=5` und `vm.dirty_ratio=15`</dt><dd>Steuert, wie viel „dirty“ (noch nicht auf Disk geschriebener) Cache erlaubt ist, bevor Writeback startet bzw. blockiert. **Warum niedriger:** verhindert große, plötzliche Schreib-Spikes, die Audio/Video und Interaktivität stören können. **Unterschied:** background startet früher sanften Writeback, dirty\_ratio ist der harte Deckel.</dd></dl></details><details id="bkmrk-vm-tuning-zram-apply"><summary>**Aktivieren**</summary>

```bash
sysctl --system
```

<dl id="bkmrk-vm-tuning-apply-warum"><dt>`sysctl --system`</dt><dd>Lädt alle sysctl-Konfigurationen neu (u. a. aus `/etc/sysctl.d/`). Unterschied zu Neustart: wirkt sofort, ohne Boot.</dd></dl></details>---

## Disk-Swap: wann, warum, Priorität

- **Warum Disk-Swap behalten?** Als letzte Rettung bei extremen Peaks oder Memory-Leaks. ZRAM kann voll laufen.
- **Warum Disk-Swap niedrig priorisieren?** Damit zuerst ZRAM genutzt wird (schneller, weniger I/O, weniger Verschleiß).
- **Hibernate:** Wenn du Hibernate nutzen willst, brauchst du Swap auf Disk in passender Größe. ZRAM ist flüchtig.

<details id="bkmrk-disk-swap-prio-fstab"><summary>**Priorität für Disk-Swap via /etc/fstab (Beispiel)**</summary>

```conf
# Beispiel-Zeile (Device/UUID an dein System anpassen):
/dev/dm-2 none swap sw,pri=-2 0 0
```

**Warum:** `pri=-2` sorgt dafür, dass Disk-Swap erst genutzt wird, wenn ZRAM nicht reicht. Unterschied zu Default: ohne explizite Prio kann die Reihenfolge je nach Setup weniger klar sein.

</details>---

## Verifizieren &amp; Monitoring (inkl. PSI)

<details id="bkmrk-verifizieren-zram-details"><summary>**Kommandos**</summary>

```bash
swapon --show
zramctl
free -h
cat /proc/pressure/memory
```

#### Wie interpretiert man das?

- **ZRAM benutzt, Disk-Swap 0:** Idealfall. Das bedeutet: schneller Swap-Puffer wird genutzt, Disk bleibt ruhig.
- **ZRAM voll + Disk-Swap steigt:** ZRAM zu klein oder Workload zu speicherhungrig. Dann Disk-Swap als Notfall aktiv, aber das System kann zäher werden.
- **PSI memory steigt (avg10/60/300):** Messbare Memory-Stalls. Das korreliert oft direkt mit „Ruckeln“. Dann sind Algorithmus (`lz4`) und `page-cluster=0` oft wichtiger als noch mehr ZRAM-Größe.

</details>---

## Rollback: wie man es sauber rückgängig macht

<details id="bkmrk-rollback-systemd"><summary>**systemd-zram-generator**</summary>

```bash
# Konfig entfernen oder auskommentieren:
# /etc/systemd/zram-generator.conf

systemctl daemon-reload
# Danach Neustart oder erneutes Initialisieren, je nach Setup/Unit-Namen.
```

**Warum:** Entfernst du die Generator-Konfig, wird beim nächsten Setup kein ZRAM mehr erstellt. Unterschied zu „swapoff“: hier wird die Ursache (Auto-Setup) entfernt, nicht nur temporär deaktiviert.

</details><details id="bkmrk-rollback-zram-tools"><summary>**zram-tools**</summary>

```bash
systemctl disable --now zramswap.service
```

<dl id="bkmrk-rollback-zram-tools-warum"><dt>`systemctl disable --now zramswap.service`</dt><dd>`--now` stoppt sofort, `disable` verhindert Autostart beim Boot. Unterschied zu `stop`: `stop` ist nur temporär, `disable` ist dauerhaft.</dd></dl></details>