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) ist ein revolutionäres Dateisystem, das die Rollen eines traditionellen Dateisystems und eines Volume-Managers vereint. 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 einzigartige Features, die es von anderen 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

    ZFS ist standardmäßig enthalten:

    zfs version
    

    ZFS-Pools erstellen

    Einzelplatte (keine Redundanz)

    ⚠️ Nicht empfohlen für Produktivdaten

    sudo zpool create tank /dev/sdb
    

    Mirror (RAID-1)

    Zwei Platten mit vollständiger Redundanz:

    sudo zpool create tank mirror /dev/sdb /dev/sdc
    

    RAID-Z1 (ähnlich wie RAID-5)

    Mindestens 3 Platten, übersteht 1 Plattenausfall:

    sudo zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd
    

    RAID-Z2 (ähnlich wie RAID-6)

    Mindestens 4 Platten, übersteht 2 Plattenausfälle:

    sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
    

    RAID-Z3

    Mindestens 5 Platten, übersteht 3 Plattenausfälle:

    sudo zpool create tank raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf
    

    Empfehlungen für ZFS-Pools

    Zuhause/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/kritische Daten

    • Immer RAID-Z2 oder RAID-Z3 verwenden
    • Hot Spares hinzufügen
    • Enterprise-Laufwerke verwenden

    ZFS-Performance optimieren

    ARC-Cache-Tuning

    ARC-Cache-Größe begrenzen (in /etc/modprobe.d/zfs.conf):

    # Limit ARC to 8GB
    options zfs zfs_arc_max=8589934592
    
    # Minimum ARC size
    options zfs zfs_arc_min=4294967296
    

    Änderungen anwenden:

    sudo update-initramfs -u
    sudo reboot
    

    Kompression aktivieren

    LZ4-Kompression ist schnell und spart Speicherplatz:

    sudo zfs set compression=lz4 tank
    

    Record-Größe konfigurieren

    Für Datenbanken (kleine zufällige I/O):

    sudo zfs set recordsize=16K tank/database
    

    Für Mediendateien (große sequenzielle I/O):

    sudo zfs set recordsize=1M tank/media
    

    Zugriffszeit-Updates deaktivieren

    Verbessert die Performance:

    sudo zfs set atime=off tank
    

    ZFS Auto-Trim aktivieren

    Für SSDs:

    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

    Sanoid für automatisiertes Snapshot-Management installieren:

    sudo apt install sanoid
    

    /etc/sanoid/sanoid.conf konfigurieren:

    [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

    Initialer vollständiger Send:

    sudo zfs send tank/documents@initial | ssh user@backup-server \
      sudo zfs receive backup/documents
    

    Nachfolgende inkrementelle Sends:

    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
    

    Oder arc_summary verwenden:

    sudo arc_summary
    

    Dataset-Nutzung

    zfs list -o name,used,avail,refer,mountpoint
    

    Auf Fehler prüfen

    sudo zpool status -v
    

    Wartung

    Pool scrubben

    Regelmäßige Scrubs verifizieren die Datenintegrität:

    sudo zpool scrub tank
    

    Scrub-Fortschritt prüfen:

    sudo zpool status
    

    Monatliche Scrubs in 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
    

    Rebuild überwachen:

    watch -n 5 zpool status
    

    Hot Spare hinzufügen

    sudo zpool add tank spare /dev/sdg
    

    Fehlerbehebung

    Pool lässt sich nicht importieren

    Import erzwingen:

    sudo zpool import -f tank
    

    Degradierter Pool

    Status prüfen:

    sudo zpool status -v
    

    Fehler löschen (falls vorübergehend):

    sudo zpool clear tank
    

    Speicherplatz voll

    Speichernutzung prüfen:

    zfs list -o name,used,avail,refer
    zfs list -t snapshot
    

    Alte Snapshots löschen:

    sudo zfs destroy tank/documents@old-snapshot
    

    Performance-Probleme

    ARC-Trefferquote prüfen:

    sudo arc_summary | grep "Hit Rate"
    

    Pool-Fragmentierung prüfen:

    sudo zpool list -o name,fragmentation
    

    Best Practices

    Do's

    ✅ ECC-RAM für Datenintegrität verwenden ✅ Regelmäßige Scrubs (monatlich) ✅ Kompression aktivieren (lz4) ✅ Häufig Snapshots erstellen ✅ Ihre Backups testen ✅ Pool-Zustand überwachen ✅ Ganze Laufwerke statt Partitionen verwenden

    Don'ts

    ❌ Niemals 80% Pool-Kapazität überschreiten ❌ Kein RAID-Z mit unterschiedlich großen Laufwerken verwenden ❌ Deduplizierung vermeiden, außer Sie haben 5GB RAM pro TB ❌ RAID-Z-vdevs nicht erweitern (nicht unterstützt) ❌ Niemals Consumer-Laufwerke ohne Test verwenden ❌ Scrub-Fehler nicht ignorieren

    Erweiterte Features

    Verschlüsselung

    Verschlüsseltes Dataset erstellen:

    sudo zfs create -o encryption=aes-256-gcm \
      -o keyformat=passphrase tank/secure
    

    Deduplizierung

    ⚠️ Erfordert erheblichen RAM

    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:

    dd if=/dev/zero of=/tank/testfile bs=1M count=10000
    

    Sequenzielles Lesen testen:

    dd if=/tank/testfile of=/dev/null bs=1M
    

    fio für umfassendes Testen verwenden:

    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 Erkenntnisse:

    • 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