Mr.PlanB Logo

    Newsletter

    Newsletter abonnieren

    Neue Infrastruktur-Guides, Vergleichsberichte und Migrationshinweise direkt ins Postfach.

    Infrastruktur-Notizen, Guides und neue Tools. Jederzeit abbestellbar.

    Zurück zum Blog
    Storage
    ZFS
    Performance

    ZFS-Konfigurationsleitfaden für optimale Performance

    5. Januar 2024
    11 Min. Lesezeit

    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

    Ressourcen