
ZFS-Konfigurationsleitfaden für optimale Performance
ZFS (Zettabyte File System) vereint die Rollen eines traditionellen Dateisystems und eines Volume-Managers in einem System. Dieser Leitfaden behandelt alles, was Sie wissen müssen, um ZFS für optimale Performance in Ihrem Homelab zu konfigurieren.
Why ZFS Hates Hardware RAID
Was macht ZFS besonders?
ZFS bietet eine Reihe von Features, die es von anderen Dateisystemen abheben:
- Datenintegrität: Eingebautes Checksumming erkennt und korrigiert stille Datenkorruption
- Snapshots: Sofortige, speichereffiziente Point-in-Time-Kopien
- RAID-Z: Software-RAID mit besserer Performance als traditionelles Hardware-RAID
- Kompression: Transparente Datenkompression zum Sparen von Speicherplatz
- Deduplizierung: Eliminiert doppelte Datenblöcke
- ARC-Cache: Intelligentes Caching-System für bessere Performance
Systemanforderungen
Mindestanforderungen
- RAM: 8GB (16GB+ empfohlen)
- CPU: Beliebiger 64-Bit-Prozessor
- Laufwerke: Mindestens 2 Laufwerke für Redundanz
Empfohlene Konfiguration
- RAM: 1GB pro TB Speicher (für Deduplizierung: 5GB pro TB)
- CPU: Multi-Core-Prozessor für bessere Performance
- Laufwerke: Enterprise-Grade-Laufwerke mit Power-Loss-Protection
ZFS installieren
Ubuntu/Debian
sudo apt update
sudo apt install zfsutils-linux
Proxmox
Bei Proxmox ist ZFS standardmäßig enthalten, die installierte Version zeigt dieser Befehl:
zfs version
ZFS-Pools erstellen
Einzelplatte (keine Redundanz)
Ein Pool aus einer einzelnen Platte ist für Produktivdaten nicht empfohlen:
sudo zpool create tank /dev/sdb
Mirror (RAID-1)
Ein Mirror nutzt zwei Platten und gibt Ihnen vollständige Redundanz:
sudo zpool create tank mirror /dev/sdb /dev/sdc
RAID-Z1 (ähnlich wie RAID-5)
RAID-Z1 braucht mindestens 3 Platten und übersteht den Ausfall von 1 Platte:
sudo zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd
RAID-Z2 (ähnlich wie RAID-6)
RAID-Z2 braucht mindestens 4 Platten und übersteht den Ausfall von 2 Platten:
sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
RAID-Z3
RAID-Z3 braucht mindestens 5 Platten und übersteht den Ausfall von 3 Platten:
sudo zpool create tank raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf
Empfehlungen für ZFS-Pools
Zuhause und Kleinbüro
- 3-4 Laufwerke: RAID-Z1 verwenden
- 5-8 Laufwerke: RAID-Z2 verwenden
- 9+ Laufwerke: RAID-Z3 oder mehrere RAID-Z2-vdevs in Betracht ziehen
Enterprise und kritische Daten
- Immer RAID-Z2 oder RAID-Z3 verwenden
- Hot Spares hinzufügen
- Enterprise-Laufwerke verwenden
ZFS-Performance optimieren
ARC-Cache-Tuning
Die Größe des ARC-Cache begrenzen Sie in der Datei /etc/modprobe.d/zfs.conf:
# Limit ARC to 8GB
options zfs zfs_arc_max=8589934592
# Minimum ARC size
options zfs zfs_arc_min=4294967296
Damit die Änderungen greifen, bauen Sie die initramfs neu und starten das System neu:
sudo update-initramfs -u
sudo reboot
Kompression aktivieren
Die LZ4-Kompression ist schnell und spart Speicherplatz, aktiviert wird sie pro Pool:
sudo zfs set compression=lz4 tank
Record-Größe konfigurieren
Für Datenbanken mit kleiner, zufälliger I/O setzen Sie die Record-Größe herunter:
sudo zfs set recordsize=16K tank/database
Für Mediendateien mit großer, sequenzieller I/O passt eine deutlich größere Record-Größe:
sudo zfs set recordsize=1M tank/media
Zugriffszeit-Updates deaktivieren
Das Abschalten der Zugriffszeit-Updates auf dem Pool verbessert die Performance:
sudo zfs set atime=off tank
ZFS Auto-Trim aktivieren
Bei SSDs aktivieren Sie Auto-Trim direkt auf dem Pool:
sudo zpool set autotrim=on tank
Mit Datasets arbeiten
Dataset erstellen
sudo zfs create tank/documents
sudo zfs create tank/photos
sudo zfs create tank/videos
Quotas festlegen
sudo zfs set quota=100G tank/documents
Reservierungen festlegen
sudo zfs set reservation=50G tank/database
Datasets auflisten
zfs list
Snapshots
Snapshot erstellen
sudo zfs snapshot tank/documents@backup-2024-01-15
Snapshots auflisten
zfs list -t snapshot
Auf Snapshot zurücksetzen
sudo zfs rollback tank/documents@backup-2024-01-15
Snapshot löschen
sudo zfs destroy tank/documents@backup-2024-01-15
Automatisierte Snapshots
Für automatisiertes Snapshot-Management installieren Sie Sanoid aus den Paketquellen:
sudo apt install sanoid
Anschließend konfigurieren Sie die Templates in /etc/sanoid/sanoid.conf nach diesem Muster:
[tank/documents]
use_template = production
recursive = yes
[template_production]
frequently = 0
hourly = 24
daily = 7
monthly = 12
yearly = 0
autosnap = yes
autoprune = yes
Send und Receive (Replikation)
Snapshot in Datei senden
sudo zfs send tank/documents@backup | gzip > backup.gz
Snapshot aus Datei empfangen
gunzip -c backup.gz | sudo zfs receive tank/restore
Inkrementelle Replikation
Der erste Lauf überträgt den vollständigen Snapshot auf den Backup-Server:
sudo zfs send tank/documents@initial | ssh user@backup-server \
sudo zfs receive backup/documents
Alle nachfolgenden Läufe übertragen nur die Änderungen seit dem letzten Snapshot:
sudo zfs send -i @initial tank/documents@today | ssh user@backup-server \
sudo zfs receive backup/documents
ZFS überwachen
Pool-Status
sudo zpool status
Pool-I/O-Statistiken
sudo zpool iostat -v 2
ARC-Statistiken
cat /proc/spl/kstat/zfs/arcstats
Etwas lesbarer wird die Ausgabe mit dem Werkzeug arc_summary:
sudo arc_summary
Dataset-Nutzung
zfs list -o name,used,avail,refer,mountpoint
Auf Fehler prüfen
sudo zpool status -v
Wartung
Pool scrubben
Ein regelmäßiger Scrub verifiziert die Datenintegrität im gesamten Pool, hier von Hand gestartet:
sudo zpool scrub tank
Den Fortschritt des laufenden Scrubs prüfen Sie über den Pool-Status:
sudo zpool status
Monatliche Scrubs lassen sich mit einem Eintrag in der crontab planen:
# Run on the first Sunday of each month at 2 AM
0 2 1-7 * * [ "$(date +\%u)" = "7" ] && /sbin/zpool scrub tank
Ausgefallenes Laufwerk ersetzen
sudo zpool replace tank /dev/sdb /dev/sdf
Den laufenden Rebuild können Sie mit watch im Blick behalten:
watch -n 5 zpool status
Hot Spare hinzufügen
sudo zpool add tank spare /dev/sdg
Fehlerbehebung
Pool lässt sich nicht importieren
Hier hilft es meist, den Import mit der entsprechenden Option zu erzwingen:
sudo zpool import -f tank
Degradierter Pool
Bei einem degradierten Pool prüfen Sie zuerst den ausführlichen Status:
sudo zpool status -v
Waren die Fehler nur vorübergehend, löschen Sie den Fehlerzähler wieder:
sudo zpool clear tank
Speicherplatz voll
Prüfen Sie zuerst, wie sich die Speichernutzung auf Datasets und Snapshots verteilt:
zfs list -o name,used,avail,refer
zfs list -t snapshot
Danach können Sie alte Snapshots löschen, die noch Platz belegen:
sudo zfs destroy tank/documents@old-snapshot
Performance-Probleme
Prüfen Sie bei Performance-Problemen als Erstes die Trefferquote des ARC-Cache:
sudo arc_summary | grep "Hit Rate"
Danach lohnt ein Blick auf die Fragmentierung des Pools:
sudo zpool list -o name,fragmentation
Best Practices
Was Sie tun sollten
ECC-RAM für Datenintegrität verwenden, monatlich scrubben, Kompression mit lz4 aktivieren, häufig Snapshots erstellen, Ihre Backups testen, den Pool-Zustand überwachen und ganze Laufwerke statt Partitionen verwenden.
Was Sie vermeiden sollten
Niemals 80% Pool-Kapazität überschreiten, kein RAID-Z mit unterschiedlich großen Laufwerken bauen, Deduplizierung nur einsetzen, wenn Sie 5GB RAM pro TB haben, RAID-Z-vdevs nicht erweitern (das ist nicht unterstützt), niemals Consumer-Laufwerke ohne Test verwenden und Scrub-Fehler nicht ignorieren.
Erweiterte Features
Verschlüsselung
Ein verschlüsseltes Dataset erstellen Sie direkt beim Anlegen mit diesen Optionen:
sudo zfs create -o encryption=aes-256-gcm \
-o keyformat=passphrase tank/secure
Deduplizierung
Deduplizierung erfordert erheblichen RAM und wird pro Dataset eingeschaltet:
sudo zfs set dedup=on tank/vms
NFS-Freigaben
sudo zfs set sharenfs=on tank/share
sudo zfs set sharenfs="rw=@192.168.1.0/24" tank/share
SMB-Freigaben
sudo zfs set sharesmb=on tank/share
Performance-Benchmarks
Sequenzielles Schreiben testen Sie am einfachsten mit dd und einer großen Datei:
dd if=/dev/zero of=/tank/testfile bs=1M count=10000
Dieselbe Datei wieder einzulesen deckt die sequenzielle Leserate ab:
dd if=/tank/testfile of=/dev/null bs=1M
Für umfassendere Tests verwenden Sie das Werkzeug fio, hier als Beispiel:
sudo apt install fio
fio --name=seqwrite --rw=write --bs=1M --size=10G \
--filename=/tank/testfile
Fazit
ZFS bietet Enterprise-Grade-Storage-Features für Ihr Homelab. Mit korrekter Konfiguration und Wartung liefert es außergewöhnliche Datenintegrität und Performance.
Die wichtigsten Punkte aus diesem Leitfaden noch einmal zusammengefasst:
- RAID-Z2 für wichtige Daten verwenden
- LZ4-Kompression aktivieren
- Regelmäßige Scrubs planen
- Häufig Snapshots erstellen
- Pool-Zustand überwachen
- Niemals 80% Kapazität überschreiten